繁体   English   中英

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

[英]How to properly use references with variadic templates

我有类似下面的代码:

   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; }

我想使用即将推出的标准中提出的可变参数模板重新实现它。 然而,到目前为止我在网上看到的所有例子似乎都是类似于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...); }

我想知道的是:

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

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

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

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

inc(1);

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

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

template<typename T,typename ... Args>
void inc(T& t, Args& ... args) { ++t; inc(args...); }

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

你的意思是右值参考? 不,我认为没有理由。

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

你已经在那里了。 你的代码应该做你想要的。

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

C ++标准不保证任何内联。 您可以查看编译器生成的内容。 如果你想要内联所有内容 - 包括最上面的inc-call - 你可以将两个函数内联作为请求 如果你想要非变量模板这样的东西,可以像这样包装:

inline void inc_impl() {}

template<typename T, typename...U>
inline void inc_impl(T& t, U&...u) { ++t; inc_impl(u...); }

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

现在inc不是内联的,而当inc_impl调用的内联完成时,它的每个实现可能都不包含真正的函数调用 - 但同样,不能保证。

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

该标准不保证将执行优化,它仅指定行为和结果。 函数是否会内联执行问题。

事实上,inline关键字只是编译器的一个提示,经常被忽略,因为编译器可以更好地决定。

最后,g ++ - 4.5在-O2处完全内联了所有inc函数。 不知道这是不是你想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM