Код: Выделить всё
#define LIFT(F) \
[&](auto&&... args) \
noexcept(noexcept((F)(std::forward(args)...))) \
-> decltype((F)(std::forward(args)...)) { \
return (F)(std::forward(args)...); \
}
// Now you can use `LIFT(std::max)` as a function-object.
Я могу аналогичным образом написать код, который вызывает F в качестве функции-члена первый аргумент:
Код: Выделить всё
#define LIFT_MEMFN(F) \
[&](auto&& self, auto&&... args) \
noexcept(noexcept(std::forward(self).F(std::forward(args)...))) \
-> decltype(std::forward(self).F(std::forward(args)...)) { \
return std::forward(self).F(std::forward(args)...); \
}
То, что мне хотелось бы и что я чувствую, могло бы быть возможным с помощью сумасшедших трюков SFINAE, но Я не понял, это написать LIFT(F), который действует как std::invoke, поэтому, если ему передан первый аргумент, a0, сначала попробуйте a0.F(args...), затем пробуем a0->F(args...), а затем возвращаемся к F(a0, args...). Возможно ли это?
Подробнее здесь: https://stackoverflow.com/questions/781 ... e-behavior
Мобильная версия