[英]Comparison : C++ template specialization approaches
哪个更正确? 和为什么。
我最近在工作中讨论如何进行特定的模板专业化。
这条路:
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> {
...
};
都不行 因为两者都不会编译! 局部专业化的语法错误!
这是完成部分专业化的方式:
//correct syntax
template <typename T>
struct SomeTemplate<T,false> {
...
};
不是这个:
//wrong syntax
template <typename T, false>
struct SomeTemplate {
...
};
在我看来,第二种方法是合理的,因为bool
只能有两个值,因此, 三个版本的SomeTemplate
类模板根本没有任何意义,这是您在第一种方法中所做的。
如果您尝试以非专门的方式使用模板,则第二种方法将生成编译器错误。 在这种情况下,第一种方法只是为您提供一个空类,这在以后尝试使用该类时可能会也可能不会产生错误。
这里的缺点是bool
只有两个值,并且您已经为这两个值专门化了,所以走什么路都没关系。 空类不会被链接,因此不会生成任何额外的代码。
这种特定情况类似于编译时断言模式:
template<bool test> struct compiler_assert;
template<> struct compiler_assert<true> {};
// ...
compiler_assert<bool_test_goes_here> assert1;
如果测试结果为false
则停止编译。
两个示例都有语法错误。 假设您修复了它们,两者之间没有任何区别。 在第一个示例中提供的空实现永远无法使用,因此不会生成任何代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.