Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 比较:C++;模板专门化方法_C++_Templates_Template Specialization - Fatal编程技术网

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类模板的三个版本根本没有意义,就像你在第一种方法中所做的那样。

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

这不是真的,两者都是正确的。它可以是正确的,也可以是不正确的,也可以是不正确的。你可以问哪一个是首选的,原因是什么。