20

私はそのようなものを探しています:

template< typename T>  
void func(T t)
{
}

template< typename... Parms> 
void anyFunc( Parms... p)
{
    func<Parms>(p)... ;  //error 
    func(p)... ;         //error 
}

パラメータパックの展開が別の関数呼び出し内で行われる場合、それは機能します。

template< typename T>
int some(T t)
{}

template< typename... Parms>
void func(Parms ...p)
{}

template< typename... Parms>
void somemore(Parms... p)
{
   func( some(p)...);
}

int main() 
{
 somemore(1,2,3,4,10,8,7, "Hallo");
}

パラメーターパックの拡張は、基本クラスの初期化子のリストでも機能します。

'void'を返す関数でも機能するソリューションはありますか?上記の回避策は機能しませんが、パラメーターリスト内でvoidを返す関数呼び出しを使用すると機能しません。

何か案は?

4

2 に答える 2

11

残念ながら、お気づきのとおり、パラメータパックの展開は、パーサーがエントリのコンマ区切りリストを期待する特定のコンテキストでのみ有効です。コンマが単なる構文区切り文字であり、コンマ演算子ではないコンテキストです。これは間違いなく現在のテキストの欠陥です。

醜い回避策:

func((some(p), 0)...);

関数の引数の評価順序、つまりsome呼び出しの順序は指定されていないため、副作用に注意する必要があることに注意してください。

于 2011-08-04T15:16:25.457 に答える
6

小さなヘルパー クラスはどうですか。

template <typename Func, typename A, typename ...Args> struct Caller
{
  static void call(Func & f, A && a, Args && ...args)
  {
    f(std::forward<A>(a));
    Caller<Func, Args...>::call(f, std::forward<Args>(args)...);
  }
};

template <typename Func, typename A> struct Caller<Func, A>
{
  static void call(Func & f, A && a)
  {
    f(std::forward<A>(a));
  }
};

template <typename Func, typename ...Args>
void Call(Func & f, Args && ...args)
{
  Caller<Func, Args...>::call(f, std::forward<Args>(args)...);
}

次に、クライアント コードに次のコードを追加できます。

void foo(A);
Call(foo, a1, a2, a3);
于 2011-08-04T21:09:37.420 に答える