- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
#include <iostream>
using namespace std;
struct GetFirst{};
template<class T>
const T &operator,(const T &val, const GetFirst &) {
return val;
}
template<class T, class U>
const T &ifvoid_impl(const T &val, const U &) {
return val;
}
template<class T>
const T &ifvoid_impl(const GetFirst &, const T &val) {
return val;
}
#define ifvoid(X, Y) (ifvoid_impl(((X), GetFirst()), (Y)))
int a() { return 1; }
void f() {}
int main() {
cout << ifvoid(a(), "[a()]") << endl
<< ifvoid(f(), "[f()]") << endl;
}
Лень проверять в шаблонном коде, возвращает ли что-то пользовательская функция? Воспользуйся волшебством оператора запятая!
Antervis 16.02.2017 15:39 # 0
Bobik 16.02.2017 17:03 # 0
dm_fomenok 16.02.2017 18:03 # 0
Antervis 16.02.2017 19:59 # 0
huesto 16.02.2017 20:05 # 0
guestinho 17.02.2017 00:11 # 0
Помню я студентом делал лабы в visual studio, где передавал rvalue по ссылке. А на gcc оно даже не компилилось..
huesto 17.02.2017 00:17 # +1
guestinho 17.02.2017 00:20 # 0
bormand 16.02.2017 20:14 # +2
A temporary bound to a reference parameter in a function call (5.2.2) persists until the completion of the full expression containing the call.
Вроде как строки 22-23 составляют один full expression...
huesto 16.02.2017 20:17 # +4
Antervis 16.02.2017 20:29 # 0
А вот напишешь decltype(auto) val = ifvoid(a(), "text"); cout << val; и словишь
huesto 16.02.2017 20:35 # +1
Вот это отмазался. Скорее беги убирать лишние переменные из кода, пока никто не увидел.
bormand 16.02.2017 20:36 # +1
Bobik 16.02.2017 20:42 # +1
Antervis 16.02.2017 15:58 # 0
http://ideone.com/9hNmMo
(без std::enable_if и callable-объектов)
Antervis 16.02.2017 16:34 # 0
http://ideone.com/I8FV5N
п.с. ideone, втф, меняешь nullptr на 0 и не компилится
huesto 16.02.2017 16:46 # +1
Bobik 16.02.2017 20:30 # 0
Antervis 16.02.2017 20:32 # −1
Bobik 16.02.2017 20:37 # 0