Variadic模板,作为参数的功能

时间:2017-07-27 13:39:26

标签: 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 << test(simple, 2); // error, 'std::forward': none of the 2 overloads could convert all the argument types
}

2 个答案:

答案 0 :(得分:3)

您的代码存在一些问题。

首先,您应该使用转发引用,因此您需要将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)...);
}

WANDBOX EXAMPLE

答案 1 :(得分:0)

第一个问题是返回类型。您的test函数返回F这是一个函数指针。而是将其更改为auto以自动推断返回类型。

第二个问题是std::forward需要非const引用。

您可以使用尾随返回类型:

template<typename F, typename... Args>
auto test(F f, Args&&... args) -> decltype(f(std::forward<Args>(args)...)) {
    return f(std::forward<Args>(args)...);
}

但是decltype(auto)(需要C ++ 14)是一个更简单的解决方案:

template<typename F, typename... Args>
decltype(auto) test(F f, Args&&... args) {
    return f(std::forward<Args>(args)...);
}