4

私が列挙型を持っていて、各列挙型の値を特定のタイプに関連付けたいと仮定します。標準タイプがdoubleであるとしましょう。それを別のものにしたい場合は、明示的に指定する必要があります。

Q1:これはそのようなことを実装するための好ましい方法ですか?

enum A {
    v1,
    v2,
    v3
};

// for every value of A, the standard type is double
template<A a>
struct A_info {
    typedef double type;
};

// other types for certain values can be specified using specialization
template<>
struct A_info<v2> {
    typedef size_t type;
};

次に、関数テンプレートがあり、列挙型の値に関連付けられているタイプに応じて関数を呼び出したいとします。

template<typename T>
void foo() { /* do something */ }

template<A a>
void bar() { 
    foo< typename A_info<a>::type >(); 
}

これは正常に機能します。ここで、可変個引数テンプレートリストに応じて別の関数があり、上記と同様のことを実行したいとします...

template<typename ... T>
void foo_multiple() { /* stuff */ }

template<A ... a>
void bar_multiple() {  
    foo_multiple< /* ??? */ > ();
}

Q2:これを実装するにはどうすればよいですか?とにかく、これは可能ですか?

4

1 に答える 1

8

必要なパターンで可変引数パックを展開するだけです。

template<A ... a>
void bar_multiple() {  
    foo_multiple<typename A_info<a>::type...> ();
}
于 2012-04-11T08:02:13.063 に答える