3

Contains継承または入れ子になった typedef によって自分自身を呼び出す再帰的なメタ関数を作成できます。次の基準との違いは何ですか?

A: コンパイル時間とコンパイル時に必要なメモリ。

B: 最大再帰制限 (他よりも多くの引数を処理できるようになるでしょうか?)

C: 遅延インスタンス化 (より多くのインスタンス化を省略できますか?これは現在の例では違いを生まないかもしれません。ただし、クラスがstd::conditionalvs から派生したというネストされた typedef を持っていた場合はそうなりますか?)

1:

template<typename T, typename... Ts>
struct Contains : std::false_type {};       //only possible if Ts is empty so does not contain
template<typename T, typename U, typename... Ts>
struct Contains<T, U, Ts...> : Contains<T, Ts...>{};
template<typename T, typename... Ts>
struct Contains<T, T, Ts...> : std::true_type{};

2:

template<typename T, typename... Ts>
struct Contains {
    typedef std::false_type Type;
};      //only possible if Ts is empty so does not contain
template<typename T, typename U, typename... Ts>
struct Contains<T, U, Ts...> {
    typedef typename Contains<T, Ts...>::Type Type;
};
template<typename T, typename... Ts>
struct Contains<T, T, Ts...>{
    typedef std::true_type Type;
};
4

1 に答える 1

3

私は継承を使用します。その理由は、自然にタグのディスパッチが可能になるからです。

template <typename T>
void f_impl(T const & t, std::true_type derivedB) { ... }
...
template <typename T>
void f(T const & t) {
   f_impl(t, is_base_of<B,T>());
}

同時に、継承を使用してネストされた情報を挿入できます。この場合は、::value評価結果がtrue.

于 2013-11-11T14:56:12.767 に答える