如何正确使用带有可变参数模板的引用

Hip*_*der 13 c++ templates variadic c++11

我有类似下面的代码:

   template<typename T1, typename T2, typename T3, typename T4>
   void inc(T1& t1, T2& t2, T3& t3, T4& t4) { ++t1; ++t2; ++t3; ++t4; }

   template<typename T1, typename T2, typename T3>
   void inc(T1& t1, T2& t2, T3& t3) { ++t1; ++t2; ++t3; }

   template<typename T1, typename T2>
   void inc(T1& t1, T2& t2) { ++t1; ++t2; }

   template<typename T1>
   void inc(T1& t1) { ++t1; }
Run Code Online (Sandbox Code Playgroud)

我想使用即将推出的标准中提出的可变参数模板重新实现它.然而,到目前为止我在网上看到的所有例子似乎都是类似于printf的例子,这里的区别似乎是引用的使用.我想出了以下内容:

inline void inc() { }

template<typename T>
inline void inc(T&& t) { ++t; }

template<typename T,typename ... Args>
inline void inc(T&& t, Args&& ... args) { ++t; inc(args...); }
Run Code Online (Sandbox Code Playgroud)

我想知道的是:

  • 我应该使用r值而不是引用吗?

  • 关于如何正确完成我想要的东西的可能提示或线索.

  • 新提议的标准对递归函数调用的问题提供了什么保证,是否有一些迹象表明上述可变版本将与原始函数一样最优?(我应该添加内联还是其他?)

R S*_*hko 12

我不会在这里使用rvalue引用,因为这将允许你绑定到rvalues,它可以允许这样的无意义的代码:

inc(1);
Run Code Online (Sandbox Code Playgroud)

所以,我会坚持定期参考:

template<typename T>
void inc(T& t) { ++t; }

template<typename T,typename ... Args>
void inc(T& t, Args& ... args) { ++t; inc(args...); }
Run Code Online (Sandbox Code Playgroud)

  • 由于参数包可以匹配空列表,因此在一个参数的情况下这些重载是不明确的.您应该使用`void inc(){}`作为基本情况,并且最好使用特化而不是重载. (3认同)
  • @Hippicoder:我觉得你误解了R Samuel.他说"我不会使用右值参考" (2认同)