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