C++ 比较:C++;模板专门化方法
哪个更正确?为什么 在最近的工作中,我参加了一个关于如何进行特定模板专门化的讨论 这样:C++ 比较:C++;模板专门化方法,c++,templates,template-specialization,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, 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> {
...
};
模板
结构SomeTemplate{//,定义为空
};
模板
结构模板{
...
};
模板
结构模板{
...
};
或者这样:
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> {
...
};
模板
struct SomeTemplate;//没有空的定义——这里的区别
模板
结构模板{
...
};
模板
结构模板{
...
};
如果您试图以非专用的方式使用模板,则第二种方法将生成编译器错误。在这些情况下,第一种方法只会给您一个空类,当您稍后尝试使用该类时,它可能会生成错误,也可能不会生成错误
这里最重要的是,bool
只有两个值,而且您对这两个值都进行了专门化,所以您选择哪种方式并不重要。空类不会被链接,因此不会生成任何额外的代码
此特定情况类似于编译时断言模式:
template<bool test> struct compiler_assert;
template<> struct compiler_assert<true> {};
// ...
compiler_assert<bool_test_goes_here> assert1;
模板结构编译器\u断言;
模板结构编译器_assert{};
// ...
编译器_断言资产1;
如果测试的计算结果为
false
,两者都不是,则停止编译。因为两者都不会编译!部分专门化的语法错误
这就是部分专门化的实现方式:
//correct syntax
template <typename T>
struct SomeTemplate<T,false> {
...
};
//语法正确
模板
结构模板{
...
};
不是这个:
//wrong syntax
template <typename T, false>
struct SomeTemplate {
...
};
//语法错误
模板
结构模板{
...
};
现在回答您的问题,假设您将修复语法!
在我看来,第二种方法是合理的,因为
bool
只能有两个值,所以SomeTemplate类模板的三个版本根本没有意义,就像你在第一种方法中所做的那样。两个示例都有语法错误。假设您修复了它们,两者之间没有任何区别。您在第一个示例中提供的空实现永远无法使用,因此不会生成代码。这不是真的,两者都是正确的。它可以是正确的,也可以是不正确的,也可以是不正确的。你可以问哪一个是首选的,原因是什么。