2

C++ で次のことを行うにはどうすればよいですか。

template <typename T>
void Foo(T t)
{
  ...
  call Bar(true) if T is of some specific type U or V
  call Bar(false) otherwise
  ...
}


void Bar(bool b)
{
  ...
}

冗長なテンプレート パラメーターを追加することもできますが、それは冗長です。

Bar をテンプレート関数にして U と V に特化することもできますが、それは私のコードではなく、おそらく問題が伝播するだけです。

CallBar呼び出すだけの関数を作成し、Bar(false)それを特殊化しBar(true)て U と V を呼び出すようにすることもできます。boolean は FooLogger の複数の場所で使用され、関数の呼び出しで使用されることがあります (そのため、複数Barの s があります) 場合によっては ?: 条件でも使用されます。

ここで何をするのが最善ですか?

4

2 に答える 2

10

慣用的な解決策は、特性を使用することです。

template <typename T>
struct BarTraits {
    static const bool value = false;
};

template <>
struct BarTraits<U> {
    static const bool value = true;
};

template <>
struct BarTraits<V> {
    static const bool value = true;
};

template <typename T>
void Foo(T t)
{
  ...
  Bar(BarTraits<T>::value);
  ...
}
于 2013-06-05T09:18:25.903 に答える
5

を使用した可能な解決策std::is_same:

template <typename T>
void Foo(T t)
{
    Bar(std::is_same<T, int>::value || std::is_same<T, char>::value);
}
于 2013-06-05T09:20:57.513 に答える