我希望基于模板参数的模板中的逻辑略有不同。我如何键入检查模板参数?
我有以下令我惊讶的不起作用:
class Bar {
Bar() {}
}
template <typename T>
void Foo(const &T a) {
if (!std::is_same<T, Bar>::value) {
// Do things that will fail for type Bar e.g.
a.Fail();
}
}
我不希望使用模板专业化,因为在现实中模板专业化最终会为我的特定目的共享大量代码(目前工作代码使用模板专业化)
目前在编译期间失败:"no member "Fail" in "Bar"
答案 0 :(得分:4)
不是专门化整个模板函数Foo
,而是专门化一个辅助方法:
template <typename T>
void FooHelper(const T &a) {
a.fail();
}
template <>
void FooHelper<Bar>(const Bar &a) {
// something other than a.fail()
}
template <typename T>
void Foo(const T &a) {
FooHelper<T>(a);
// etc. etc.
}
答案 1 :(得分:4)
每个分支应对每种类型都有效 在C ++ 17中,你可以使用iftexx来改变它:
template <typename T>
void Foo(const &T a) {
if constexpr (!std::is_same<T, Bar>::value) {
// Do things that will fail for type Bar e.g.
a.Fail();
}
}
之前,您必须依赖专业化或超载。 例如
template <typename T>
void Fail(const T& t) { t.Fail(); }
void Fail(const Bar&) { /*Empty*/ }
template <typename T>
void Foo(const &T a) {
// ...
Fail(a);
// ...
}