gpt4 book ai didi

c++ - 使用成员函数调用可变参数模板函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:24:59 25 4
gpt4 key购买 nike

基于我之前在这里的问题 Variadic template, function as argument

我在下面得到了一个简单的类,但是如何使用 std::invoke 或其他方法以 Tester::simple 作为参数调用 Tester::test 呢? http://en.cppreference.com/w/cpp/utility/functional/invoke#Example 中提供的示例对我帮助不大,我尝试了很多不同的方法来使用 std::invoke。

class Tester {
public:
template<typename F, typename... Args>
decltype(auto) test(F&& f, Args&&... args) {
return std::forward<F>(f)(std::forward<Args>(args)...);
}
int simple(int i) { return i; }
};

int main()
{
Tester t;
std::cout << t.test(t.simple, 3); // how do you modify this line such that the code compiles?
}

谢谢!

最佳答案

一种方法是像这样修改 test() 成员函数的定义:

class Tester { 
public:
template<typename F, typename... Args>
decltype(auto) test(F&& f, Args&&... args) {
return std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
}
int simple(int i) { return i; }
};

然后我们可以将成员函数指针传递给 test(),将调用该方法的实例作为第二个参数,然后是函数参数本身:

int main()
{
Tester t;
std::cout << t.test(&Tester::simple, t, 3);
}

之所以可行,是因为 std::invoke 有一个 special overload for pointers-to-members , 这样

std::invoke(ptr-to-member, instance, args...);

被称为

(instance.*ptr-to-member)(args...);

这正是我们在这种情况下想要的。

关于c++ - 使用成员函数调用可变参数模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45355338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com