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

Wal*_*ter 3 c++ pass-by-reference variadic-templates c++11

假设,我有一个使用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...)); }
 };
Run Code Online (Sandbox Code Playgroud)

和派生类

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

然后想要使用variadic模板成员via

container c( /* args for ctor */ );
my_task::spawn(c,0);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ely 6

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

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