使用成员函数调用可变参数模板函数
Calling a variadic template function with a member function
基于我之前的问题 可变参数模板,函数作为参数
我最终在下面得到了一个简单的类,但是我如何使用 std::invoke 或其他一些方法来调用 Tester::test 与 Tester::simple 作为参数?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
对指向成员的指针具有特殊的重载,例如
std::invoke(ptr-to-member, instance, args...);
被称为
(instance.*ptr-to-member)(args...);
在这种情况下,这正是我们想要的。
请注意,std::invoke
是C++ 17的一部分。如果它不可用,则可以实现test
函数,以便它接受指向成员函数的指针和类的实例:
template<typename F, typename T, typename... Args>
decltype(auto) test(F f, T&& t, Args&&... args) {
return (std::forward<T>(t).*f)(std::forward<Args>(args)...);
}
现在,test
接受指向成员函数的指针作为第一个参数,接受类的实例作为第二个参数以及任意数量的附加参数。
那么test
可以这样称呼:
Tester t;
std::cout << t.test(&Tester::simple, t, 42);
魔杖盒示例
只是为了提及另一种可能性,您可以将成员函数调用包装在 lambda 中并捕获实例t
。 在 C++14 中,我们可以为此使用通用 lambda,因此我们不必显式指定参数。
#include <iostream>
#include <utility>
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] (auto&&... args) { return t.simple(std::forward<decltype(args)>(args)...); }, 3);
}
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类