11

私は最近 C++11 の使用を開始し、可変個引数テンプレートに関するチュートリアルを読みました。このような可変個引数テンプレートを定義できることを理解しました

// example class that uses variadic template
template<typename ...Args> struct mtuple;

しかし、クラスのテンプレート引数をどのように処理できますmtupleか (つまり、どのようにget<int>(mtuple_obj)見えるでしょうか?)。

4

2 に答える 2

4

どのget<1>(t)ように見えるかは、の実装によって異なりますmtuple。典型的な実装は、各引数を保持する型から再帰的に継承するためmtuple<A,B,C>TupleHead<A>(型のメンバーを持つA) から継承し、さらに からも継承し TupleTail<B,C>ます。 (タイプ のメンバーを持つ) およびTupleTail<B,C>から継承します。から継承します ( type のメンバーを持ちます。)TupleHead<B>BTupleTail<C>TupleTail<C>TupleHead<C>C

ここで、各基本クラスにも整数パラメーターを指定すると、次のようになります。

mtuple<A,B,C>から継承しTupleHead<0,A>TupleTail<1,B,C>

TupleTail<1,B,C>から継承しTupleHead<1,B>TupleTail<2,C>

TupleTail<2,C>から継承TupleHead<2,C>

には、アップキャストによって取得できる型の一意の基本クラスが 1 つあり、その基本クラスのメンバーを返すget<1>ため、比較的簡単に記述できます。mtupleTupleHead<1,B>B

[編集:インデックス 1 のタプル要素に対応するget<1>(m)型を知る必要があります。そのためには、上記の再帰的な継承階層にも依存し、部分的な特殊化を使用してインデックス 1 の基本クラスを取得し、次に決定するようなものを使用しますその部分的な特殊化のパラメーター。これは私の例で示しています。]Bstd::tuple_elementTupleHead<1,T>TB

可変個引数テンプレートで使用される手法の多くは、関数型プログラミング手法です。たとえば、テンプレート パラメーター パックの最初の要素を操作してから、すべての要素を処理するまで、パックの残りの要素に対して同じことを再帰的に実行します。テンプレート パラメーター パックで直接実行できることは、そのサイズをカウントする ( を使用) か、それを使用して別のテンプレートをインスタンス化すること以外にはあまりありません。そのため、通常のアプローチは、パックを分割してヘッドを処理sizeof...する別のテンプレートをインスタンス化し、再帰的に行うことです。に同じことをするArgsArgHead, ArgsTail...ArgsTail

于 2012-05-04T13:58:08.033 に答える
4

可変個引数テンプレートの値を反復処理する単純なメカニズムはありません。しかし、これは再帰的に行うことができます。次に例を示します。

template<typename T, typename... Args>
void print_values(const char *s, T value, Args... args)
{
    while (*s) {
        if (*s == '%' && *(++s) != '%') {
            std::cout << value;
            ++s;
            print_values(s, args...);
            return;
        }
        cout << *(s++);
    }
}

したがって、呼び出すprint_values("%d %d %d", 1, 2, 3)と、次の再帰ツリーが得られます。

print_values("%d %d %d", 1, 2, 3) // value -> 1, args... -> 2,3
print_values("%d %d", 2, 3) // value -> 2, args... -> 3
print_values("%d", 3) // value -> 3, args... -> NULL
print_values("") // value -> NULL, args... -> NULL

print_values()*s == 0 の場合でも再帰的に呼び出して、余分な引数を検出します

ソース: http://en.wikipedia.org/wiki/Variadic_templates

于 2012-05-04T11:30:17.803 に答える