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

2つのオプションがあります。引数を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参照パラメータを受け取る関数を使用してを作成する場合や、を使用する場合などstd::bindです。

于 2013-03-27T11:17:59.153 に答える