0

そこで、可変個引数テンプレートを使用して単純なタプル クラスを作成しました...

実用的なgetメソッド/ヘルパー関数を作成するにはどうすればよいですか? 私が使用している現在のものは、空のタプルで定義された get をコンパイラに期待させます。

コードは次のとおりです。

template<typename... T>
class tuple;

template< > 
class tuple< > { };

template<typename U, typename... T>
class tuple<U, T...>
{
public:
  tuple () {};
  tuple (U f, T... r);

  U get (int idx, int numCalls = 0) const;

  U first_;
  tuple<T...> rest_;
};

template<typename U, typename... T>
tuple<U, T...>::tuple (U f, T... r)
{
  first_ = f;
  rest_ = tuple<T...> (r...);
}

template<typename U, typename... T>
U tuple<U, T...>::get (int idx, int numCalls) const
{
  if (idx == numCalls)
    return first_;

  return rest_.get (idx, numCalls + 1);
}

助けてくれてありがとう!

4

2 に答える 2

1

1 つのタイプとゼロ タイプの特殊化を追加します。

template <typename T>
class tuple
{
  T first_;

  // get() ...
}

あなたの設計は非常に非効率的であることに注意してください。まず、getインデックスは実際にはコンパイル時の定数パラメーターである必要があるため、必要ですget<i>(そうですstd::tuple)。ランタイム コードにはエラー チェックが含まれておらず、コンパイル時に無効な呼び出しを検出することはできません。第 2 に、すべてのコンストラクターが多数のコピーを実行し、完全な転送を可能にするためにおそらく変更する必要があります。

于 2011-11-21T02:06:20.517 に答える
0

現在のコードを機能させるには、何も返さない空のタプルで get 関数を作成します。
または、好きな引数の数のパラメーターを使用して取得することをお勧めします。

template<typename U, int N>
U get()

次に、削減されたNで前方に通過させ、Nが0の場合、要素を返すように特殊化します。

于 2011-11-21T02:05:27.843 に答える