是否可以将引用传递给可变参数模板函数?

时间:2013-03-27 11:12:51

标签: c++ c++11 pass-by-reference variadic-templates

假设我有一个使用CRTP的基类并提供一个可变参数模板静态成员函数

template<typename derived_task>
struct task_impl : library::task
{
   /* some useful functionality implemented using CRTP */
   /// static method for spawning a task.
   template<typename... Args>
   static void spawn(Args... args)
   { library::spawn(new task(args...)); }
 };

和派生类

struct my_task : task_impl<my_task>
{
  /* implementation using functionality of task_impl<> */
  my_task(container&c, int i);
};

然后想通过

使用可变参数模板成员
container c( /* args for ctor */ );
my_task::spawn(c,0);

这里发生的是spawn()创建容器的副本,而不是通过引用传递原始容器。有没有办法强制执行参考?

2 个答案:

答案 0 :(得分:6)

你有两个选项,要么用reference_wrapper包装参数,所以函数调用复制reference_wrapper而不是它引用的对象,或者让你的可变参数函数使用完美转发,这样它就可以通过参考参数:

template<typename... Args>
 static void spawn(Args&&... args)
 { library::spawn(new task(std::forward<Args>(args)...)); }

答案 1 :(得分:1)

您可以使用std::ref来包装参数。

这实际上经常发生,例如在使用带参考参数的函数创建std::thread时,或使用std::bind时。