首页 >后端开发 >C++ >为什么 Boost 中没有标准的'is_complete”模板?

为什么 Boost 中没有标准的'is_complete”模板?

DDD
DDD原创
2024-10-29 01:47:30342浏览

 Why is There No Standard `is_complete` Template in Boost?

检查类型完整性的模板

简介

确定类型是否完整是编程的一个重要方面。虽然 Boost 库提供了广泛的 TypeTraits,但明显缺少 is_complete 模板。本文探讨了为什么缺少这样的模板,并提出了一种采用 SFINAE 的解决方案。

sizeof 问题

定义 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 和类型完整性

虽然通常使用 SFINAE(替换失败不是错误)机制要根据类型属性启用或禁用模板专门化,不能直接应用它来检查类型完整性。原因是 is_complete 必须计算为常量,而不是类型。

结论

Boost 库中缺少标准 is_complete 模板是由于应用 sizeof 带来的挑战不完整的类型和 SFINAE 的局限性。然而,特定于平台的解决方案,例如 Alexey Malistov 提出的解决方案,可以提供一种实用的方法来检查某些环境中的类型完整性。

以上是为什么 Boost 中没有标准的'is_complete”模板?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn