如何在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)
并专门为U和V调用Bar(true)
。但这个例子实际上有点过于简单了。 boolean在FooLogger中的多个位置有时用于调用函数(因此有时会有多个Bar
s)甚至在?:conditionals中。
这里最好的事情是什么?
答案 0 :(得分: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);
...
}
答案 1 :(得分:5)
使用std::is_same
的可能解决方案:
template <typename T>
void Foo(T t)
{
Bar(std::is_same<T, int>::value || std::is_same<T, char>::value);
}