2017-04-11 5 views
2

私はこのライブラリ用のAPIを設計しています。任意の数の引数をとるこの関数があります(テンプレート化されています)。私は、これら2つは、(両方向に)交換可能である知るvariadic-template APIを設計するときに、タプルやパラメータパックを取るほうがいいですか?

template<typename... Ts>  
void foo(bar_t bar, std::tuple<Ts...> params); 

:なるように、

template<typename... Ts>  
void foo(bar_t bar, Ts... params); 

又は、代替的に:私があることを定義することができ

C++11: I can go from multiple args to tuple, but can I go from tuple to multiple args?

をそれほど両方のオプションはまったく同じですが、私は他のものよりも1つの異形を好むべきですか、それとも味覚/個人的なスタイルの問題ですか?

+1

異種初期化リスト '{t1、t2、t3、...} 'が' std :: tuple '型* (現在の言語の一部ではない) 'T1、T2 ...'の控除*の場合、最初の選択肢はもっと一般的ですが、他の理由では不便です。 2番目のオプションは、呼び出し元に明示的な 'std :: tuple <...>'または 'std :: make_tuple'関数について知らせるものです。 – alfC

答えて

1
  1. タプルの方法は、呼び出し側でより困難です。たとえば、転送では、ユーザーが別のtuple定義またはforward_as_tuple定義を使用する必要があります。対照的に、variadicの場合の転送は、関数のインタフェースの問題ではありません。呼び出し元はそれを意識する必要はありません。

  2. タプルの方法は、多くの用途で実装者の側でより困難です。パラメータパックの開梱は、tupleを開梱するよりはるかに簡単です。また、パラメータパックは限られていますが、tupleよりもはるかに柔軟性があります。

  3. タプル方式では、コールチェーンが可能です。 Variadicの戻り値などはありません。構造化バインディングは近づきますが、関数の複数のパラメータに複数の戻り値を格納することはできません。対照的に、タプルとタプルの戻り値では、ある関数から別の関数に呼び出しを連結できます。

コールチェーンがあなたにとって大変重要なものであれば、タプルインターフェイスが適切かもしれません。さもなければ、それは少しの本当の利益のためのちょうど多くの手荷物です。