Макрос LIFT, имеющий поведение, подобное std::invoke?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Макрос LIFT, имеющий поведение, подобное std::invoke?

Сообщение Anonymous »

Мне нужен макрос LIFT(F). Я могу написать это достаточно легко:

Код: Выделить всё

#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.
https://godbolt.org/z/r6bY6P15T
Я могу аналогичным образом написать код, который вызывает 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)...); \
}
https://godbolt.org/z/1cG5YTY1W
То, что мне хотелось бы и что я чувствую, могло бы быть возможным с помощью сумасшедших трюков SFINAE, но Я не понял, это написать LIFT(F), который действует как std::invoke, поэтому, если ему передан первый аргумент, a0, сначала попробуйте a0.F(args...), затем пробуем a0->F(args...), а затем возвращаемся к F(a0, args...). Возможно ли это?

Подробнее здесь: https://stackoverflow.com/questions/781 ... e-behavior
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»