6

クラス テンプレートを考慮すると、タイプ トレイトとダミー イネーブラー テンプレート パラメーターを使用して、特定のタイプのグループにテンプレートの特殊化を提供できます。私はすでにそれを以前に尋ねました。

ここで、関数テンプレートにも同じことが必要です。つまり、テンプレート関数があり、型のグループ (たとえば、 class のサブタイプであるすべての型) の特殊化が必要ですX。これは、次のような型特性で表現できます。

std::enable_if<std::is_base_of<X, T>::value>::type

私はこのようにすることを考えました:

template <typename T, typename ENABLE = void>
void foo(){
    //Do something
}

template <typename T>
void foo<T,std::enable_if<std::is_base_of<A, T>::value>::type>(){
    //Do something different
}

ただし、関数テンプレートでは部分的な特殊化が許可されていないため、これは機能しません。では、どうすればよいのでしょうか?たぶん、型特性を型として持つデフォルトのパラメーターですか?しかし、コードはどのように見えますか?

4

4 に答える 4

7

オーバーロード:

void foo_impl(T, std::false_type);

void foo_impl(T, std::true_type);

foo(T t) { foo_impl(t, std::is_base_of<A, T>()); }
于 2012-09-03T14:51:10.340 に答える
3

あなたが求めているものに最も近いのはenable_if、戻り値の型です:

template<typename T> typename std::enable_if<std::is_same<T, int>::value>::type foo();
template<typename T> typename std::enable_if<std::is_same<T, char>::value>::type foo();

ただし、ヘルパー関数またはクラスへのディスパッチは、より読みやすく効率的である可能性があります。

ヘルパー関数:

template<typename T> void foo_helper(std::true_type);
template<typename T> void foo_helper(std::false_type);
template<typename T> void foo() { foo_helper(std::is_same<T, int>()); }

ヘルパー クラス:

template<typename T, bool = std::is_same<T, int>::value> struct foo_helper {};
template<typename T> struct foo_helper<T, true> { static void foo(); };
template<typename T> struct foo_helper<T, false> { static void foo(); };
template<typename T> void foo() { foo_helper<T>::foo(); }
于 2012-09-03T14:54:08.890 に答える
0

クラス テンプレートで実際の実装 (部分的な特殊化など) を行い、クラス テンプレートで静的関数を呼び出すだけの小さなラッパー テンプレート関数を記述します。

于 2012-09-03T14:51:19.430 に答える