c++ - 转发参数的可变参数列表

标签 c++ c++11 templates c++14 perfect-forwarding

下面的代码都按预期编译并执行,它们有什么不同吗?

template<typename T, typename ...U>
auto time_function(T&& func, U&& ...args)
{
   std::cout << "timing" << std::endl;
   auto val = std::forward<T>(func)(std::forward<U...>(args...));
   std::cout << "timing over" << std::endl;
   return val;
}

template<typename T, typename ...U>
auto time_function(T&& func, U&& ...args)
{
   std::cout << "timing" << std::endl;
   auto val = std::forward<T>(func)(std::forward<U>(args)...);
   std::cout << "timing over" << std::endl;
   return val;
}

查看SO How would one call std::forward on all arguments in a variadic function? ,第二个似乎是推荐的,但是第一个不是做同样的事情吗?

最佳答案

它们不一样。在数量为args的情况下它们是相同的。为1或0。否则将无法编译,请考虑..

#include <iostream>
using namespace std;
template<typename T, typename ...U>
auto time_function_1(T&& func, U&& ...args)
{

    std::cout<<"timing"<<std::endl;
    auto val = std::forward<T>(func)(std::forward<U...>(args...));
    std::cout<<"timing over"<<std::endl;
    return val;
}

    template<typename T, typename ...U>
auto time_function_2(T&& func, U&& ...args)
{

    std::cout<<"timing"<<std::endl;
    auto val = std::forward<T>(func)(std::forward<U>(args)...);
    std::cout<<"timing over"<<std::endl;
    return val;
}



int f (int){return 0;}

int y (int,int){return 0;}

int main() {
    time_function_1(f,1);
    time_function_2(f,1);

    time_function_1(y,1,2); // fail
    time_function_2(y,1,2);
    return 0;
}

Demo

失败案例std::forward<U...>(args...)扩展到forward<int, int>(int&, int&)并且将无法编译。

std::forward<U>(args)...扩展到std::forward<int>(int&),std::forward<int>(int&)

关于c++ - 转发参数的可变参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58652481/

相关文章:

xcode - 使用clang++ 4.2时,“选择的构造函数在复制初始化错误中是显式的”

c++ - 如何将 std::future<T> 转换为 std::future<void>?

javascript - 自定义 onclick 函数作为 Knockout SimpleGrid 中的属性

c++ - 我想获取用户输入并将其放入字符串数组 c++

c++ - istream 不消耗字符?

c++ - Qt 停止应用程序一段时间

c++ - 是否可以使用参数包而不是嵌套模板序列?

python - make 在 make 调用期间找不到 OpenCV 库

c++ - 在 VC++ 11 中使用别名声明

c++ - 链接模板类函数