C++ 变量模板,函数作为参数
我想在变量模板中使用函数作为参数,为什么下面的方法不起作用?我如何让它工作C++ 变量模板,函数作为参数,c++,templates,variadic-templates,C++,Templates,Variadic Templates,我想在变量模板中使用函数作为参数,为什么下面的方法不起作用?我如何让它工作 template<typename F, typename... Args> F test(F f, const Args&&... args) { return f(std::forward<Args>(args)...); } int simple(int i) { return i; } int main() { std::cout <<
template<typename F, typename... Args>
F test(F f, const Args&&... args) {
return f(std::forward<Args>(args)...);
}
int simple(int i) {
return i;
}
int main()
{
std::cout << test(simple, 2); // error, 'std::forward': none of the 2 overloads could convert all the argument types
}
模板
F测试(F,常数参数和参数){
返回f(标准::转发(参数)…);
}
简单整数(整数i){
返回i;
}
int main()
{
std::cout第一个问题是返回类型。您的test
函数返回函数指针F
。将其更改为auto
,以自动推断返回类型
第二个问题是std::forward
需要非常量引用
您可以使用尾随返回类型:
template<typename F, typename... Args>
auto test(F f, Args&&... args) -> decltype(f(std::forward<Args>(args)...)) {
return f(std::forward<Args>(args)...);
}
第一个问题是返回类型。您的test
函数返回函数指针F
。将其改为auto
,以自动推断返回类型
第二个问题是std::forward
需要非常量引用
您可以使用尾随返回类型:
template<typename F, typename... Args>
auto test(F f, Args&&... args) -> decltype(f(std::forward<Args>(args)...)) {
return f(std::forward<Args>(args)...);
}
您的代码有几个问题
首先,您应该使用转发引用,因此需要将const Args&&…
更改为Args&&…
然后,test
不必返回F
。因此在这里使用decltype(auto)
是合理的
除此之外,转发f
也是有意义的
固定版本可能如下所示:
template<typename F, typename... Args>
decltype(auto) test(F&& f, Args&&... args) {
return std::forward<F>(f)(std::forward<Args>(args)...);
}
模板
decltype(自动)测试(F&&F,Args&&…Args){
return std::forward(f)(std::forward)您的代码有几个问题
首先,您应该使用转发引用,因此需要将const Args&&…
更改为Args&&…
然后,test
不必返回F
。因此在这里使用decltype(auto)
是合理的
除此之外,转发f
也是有意义的
固定版本可能如下所示:
template<typename F, typename... Args>
decltype(auto) test(F&& f, Args&&... args) {
return std::forward<F>(f)(std::forward<Args>(args)...);
}
模板
decltype(自动)测试(F&&F,Args&&…Args){
返回标准::向前(f)(std::forward为什么我将'test'函数和'simple'函数作为公共函数添加到一个基本类'Tester',并且主要做:Tester t;std::cout@Alexander,因为simple
成为一个成员函数。您不能将成员函数传递给上面编写的test
函数。至少,您已经e提供一个调用成员函数的实例。查看std::invoke
了解更多详细信息:为什么当我将“test”函数和“simple”函数作为公共函数添加到一个基本类“Tester”中,并且主要做:Tester t;std::cout@Alexander,因为simple
成为一个成员函数。You无法将成员函数传递给上面编写的测试
函数。至少,您必须提供调用成员函数的实例。有关详细信息,请参阅std::invoke
: