哪个更正确?为什么。
在工作中,我最近在讨论如何进行特定的模板专业化。
这样:
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> {
...
};
答案 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)
两个示例都有语法错误。假设你修复它们,两者之间没有任何区别。您在第一个示例中提供的空实现永远不会被使用,因此不会生成任何代码。