确定类型是否完整是编程的一个重要方面。虽然 Boost 库提供了广泛的 TypeTraits,但明显缺少 is_complete 模板。本文探讨了为什么缺少这样的模板,并提出了一种采用 SFINAE 的解决方案。
定义 is_complete 模板的直接挑战在于将 sizeof 应用于不完整的模板类型非法。此限制源于由于缺乏有效的对象大小而可能出现歧义和未定义行为。
为了解决此限制,Alexey Malistov 提出了一个平台 -利用特定于编译器的宏的特定解决方案。他的方法依赖于 __COUNTER__ 宏,该宏随着每次宏调用而递增。这允许为每种测试类型构建具有唯一虚拟参数的模板。
此解决方案的代码如下所示:
<code class="cpp">namespace { template<class T, int discriminator> struct is_complete { static T & getT(); static char (& pass(T))[2]; static char pass(...); static const bool value = sizeof(pass(getT()))==2; }; } #define IS_COMPLETE(X) is_complete<X,__COUNTER__>::value</code>
通过将 is_complete 定义为嵌套类模板并利用 __COUNTER__ 宏作为鉴别器,可以以特定于平台的方式检查类型完整性。 pass 函数用作应用 sizeof 并区分完整类型和不完整类型的虚拟参数。
虽然通常使用 SFINAE(替换失败不是错误)机制要根据类型属性启用或禁用模板专门化,不能直接应用它来检查类型完整性。原因是 is_complete 必须计算为常量,而不是类型。
Boost 库中缺少标准 is_complete 模板是由于应用 sizeof 带来的挑战不完整的类型和 SFINAE 的局限性。然而,特定于平台的解决方案,例如 Alexey Malistov 提出的解决方案,可以提供一种实用的方法来检查某些环境中的类型完整性。
以上是为什么 Boost 中没有标准的'is_complete”模板?的详细内容。更多信息请关注PHP中文网其他相关文章!