struct S {
void f(int i);
int x;
};
int main() {
auto mem_vptr = &S::x;
auto mem_fptr = &S::f;
S s;
std::invoke(mem_vptr, s); // invoke like s.*mem_vptr;
std::invoke(mem_fptr, s, 0); // invoke like (s.*mem_fptr)(0);
}
namespace detail {
template <class F, class Tuple, std::size_t... I>
constexpr decltype(auto) apply_impl(F&& f, Tuple&& t, std::index_sequence<I...>)
{
// This implementation is valid since C++20 (via P1065R2)
// In C++17, a constexpr counterpart of std::invoke is actually needed here
return std::invoke(std::forward<F>(f), std::get<I>(std::forward<Tuple>(t))...);
}
2条答案
按热度按时间xpcnnkqh1#
std::invoke
使所有Callable对象能够被“统一”调用,其中包含指向成员函数的指针和指向不能用像f(args...)
这样的常规函数调用形式调用的成员变量的指针bhmjp9jg2#
std::apply
的一个实际用途是元组解包,可能是嵌套的。它将打印:
如果你看一下
std::apply
的实现,它可能使用std::invoke
,就像example from cppreference一样。关键部分: