模板类型检查参数C ++,不同类型的执行路径

时间:2017-09-12 00:27:45

标签: c++ templates

我希望基于模板参数的模板中的逻辑略有不同。我如何键入检查模板参数?

我有以下令我惊讶的不起作用:

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"

2 个答案:

答案 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);
    // ...
}