4

假设,我有一个使用 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()创建容器的副本,而不是通过引用传递原始容器。有没有办法强制引用?

4

2 回答 2

6

您有两个选择,要么用 a 包装参数,reference_wrapper以便函数调用复制reference_wrapper它所引用的对象,要么让你的可变参数函数使用完美转发,以便它可以通过引用传递参数:

template<typename... Args>
 static void spawn(Args&&... args)
 { library::spawn(new task(std::forward<Args>(args)...)); }
于 2013-03-27T12:53:28.867 回答
1

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

这实际上发生得相当频繁,例如在std::thread使用带有引用参数的函数创建 s 时,或者在使用std::bind.

于 2013-03-27T11:17:59.153 回答