繁体   English   中英

比较:C ++模板专业化方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM