0

哪个更正确?为什么。

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

这边走:

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> {
  ...
};
4

3 回答 3

2

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

这就是部分专业化的完成方式:

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

不是这个:

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

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

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

于 2011-01-19T15:20:29.013 回答
0

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

这里的关键是只有两个值,bool并且你已经专门针对这两个值,所以你走哪条路真的无关紧要。空类不会被链接,因此不会生成任何额外的代码。

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

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

// ...

compiler_assert<bool_test_goes_here> assert1;

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

于 2011-01-19T15:19:14.387 回答
0

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

于 2011-01-19T15:24:33.940 回答