比较:C ++模板专业化方法

时间:2011-01-19 15:14:42

标签: c++ templates template-specialization

哪个更正确?为什么。

在工作中,我最近在讨论如何进行特定的模板专业化。

这样:

template <typename T, bool someBoolVar = is_polymorphic<T>::value>
struct SomeTemplate { // with empty definition
};

template <typename T>
struct SomeTemplate<T, true> {
  ...
};

template <typename T>
struct SomeTemplate<T, false> {
  ...
};

或者这样:

template <typename T, bool someBoolVar = is_polymorphic<T>::value>
struct SomeTemplate; // without empty definition           -- difference here

template <typename T>
struct SomeTemplate<T, true> {
  ...
};

template <typename T>
struct SomeTemplate<T, false> {
  ...
};

3 个答案:

答案 0 :(得分:2)

都不是。因为两者都不会编译!部分特化的语法错误!

这是部分专业化的方式:

//correct syntax
template <typename T>
struct SomeTemplate<T,false> {
  ...
};

不是这个:

//wrong syntax
template <typename T, false>
struct SomeTemplate {
  ...
};

现在回答您的问题,假设您将修复语法!

在我看来,第二种方法是合理的,因为bool只能有两个值,所以三个版本的SomeTemplate类模板没有任何意义,你在第一种方法中正在做。

答案 1 :(得分:0)

如果您尝试以非专用的方式使用模板,则第二种方法将生成编译器错误。第一种方法只是在这些情况下为您提供一个空类,以后在您尝试使用该类时可能会或可能不会生成错误。

这里的踢球者是bool只有两个值,而且你专注于两者,所以你走哪条路并不重要。空类不会被链接,因此不会生成任何额外的代码。

这个特定情况类似于编译时断言模式:

template<bool test> struct compiler_assert;
template<> struct compiler_assert<true> {};

// ...

compiler_assert<bool_test_goes_here> assert1;

如果测试评估为false,则会停止编译。

答案 2 :(得分:0)

两个示例都有语法错误。假设你修复它们,两者之间没有任何区别。您在第一个示例中提供的空实现永远不会被使用,因此不会生成任何代码。