0

この答えは、テンプレートクラスメモを1つの方法で前方宣言し、別の方法で部分的な特殊化を実装しました。

したがって、前方宣言は次のとおりです。

template <template <typename...> class Container, typename...> struct Memo;

部分的な特殊化 this :

template <typename R, typename... Args, template <typename...> class Container>
struct Memo<Container, R, std::tuple<Args...>>

Container テンプレート引数は、可変引数テンプレート引数で切り替えられます (誰かが私が今書いたことを理解してくれることを願っています)。R はパックの最初の要素です。

コードは正常にコンパイルされるので、なぜそれが許可されているのかを簡単に説明する必要があると思います。

では、なぜテンプレートの特殊化でテンプレート引数を切り替えることができるのでしょうか? テンプレート特化が独立型だからでしょうか。

4

1 に答える 1

0

部分的なテンプレートの特殊化では、テンプレート引数の順序はまったく問題になりません。これは、部分的なテンプレートの特殊化は実際にはテンプレートではなく、既存のテンプレートの特殊化にすぎないためです。
つまり、部分的なテンプレートの特殊化のテンプレート パラメーターのセットは、テンプレートのパラメーターではなく、特殊化が使用/必要とするジェネリック パラメーターのセットの宣言にすぎません。

例を考えてみましょう:

// A typelist template:
template<typename... Ts>
struct type_list {};

// A metafunction for concatenating typelists (Forward declaration):
template<typename LIST1 , typename LIST2>
struct concat;

//The partial specialization of that template for typelists:
template<typename... Ts , typename... Us>
struct concat<type_list<Ts...> , type_list<Us...>>
{
    using result = type_list<Ts...,Us...>;
};

メタ関数の部分的な特殊化でconcat行っているのは、テンプレートを 2 つの未指定の型リストに特殊化することです。したがって、タイプライトのテンプレート パラメータは指定されていません。つまり、ジェネリックです。そして、それを使用する前に、そのジェネリック パラメータを「宣言」する必要があります。
部分的なテンプレートの特殊化のテンプレート パラメーターは、特殊化が必要とするジェネリック パラメーターの宣言としてのみ考慮してください。実際のテンプレート パラメーターがないため、テンプレート パラメーターの制限はありません。特殊化では、テンプレートで許可されていない 2 つの可変個パックを使用したことに注意してください。

于 2013-09-14T11:49:24.920 に答える