【问题标题】:boost::is_enum how it works?boost::is_enum 它是如何工作的?
【发布时间】:2012-10-26 07:28:15
【问题描述】:

我很感兴趣这东西在理论上是如何工作的。 示例:

#include <boost/type_traits/is_enum.hpp>
#include <iostream>

enum foo 
{
    AAA,
    BBB
};

typedef foo bar;

struct sfoo {
    enum bar {
        CCC
    };
};

int main()
{
    std::cout << boost::is_enum<foo>::value << "\n";        // 1
    std::cout << boost::is_enum<bar>::value << "\n";        // 1
    std::cout << boost::is_enum<sfoo>::value << "\n";       // 0
    std::cout << boost::is_enum<int>::value << "\n";        // 0
    std::cout << boost::is_enum<sfoo::bar>::value << "\n";  // 1
    return 0;
}

我尝试探索源代码,但太难了(宏 + 模板代码导航失败)。有人可以进行理论探索它是如何工作的吗?我不知道如何实现它。

【问题讨论】:

标签: c++ boost typetraits


【解决方案1】:

您遇到了很多宏,因为 Boost 在它支持的所有平台的编译器内在函数之间切换。例如,Visual C++ 定义了__is_enum(T),如果Tenum,则返回true,否则返回false。 MSDN 有一个 list 的此类内部函数,Visual C++ 为支持类型特征而实现。

is_enum 现在是 C++11 的一部分,并包含在 type_traits 标头中。浏览您的标准库实现很可能比 Boost 标头更容易。

编辑:
我找到了 Boost 实现;它位于&lt;boost_path&gt;\boost\type_traits\intrinsics.hpp。在此文件中搜索BOOST_IS_ENUM,您将看到各种编译器实现的编译器内在函数。有趣的是,他们似乎都将这个特定的实现为__is_enum(T)

【讨论】:

    【解决方案2】:

    boost::is_enum 的实现类似于std::is_enum。它需要一些编译器魔法。检查以下具有相同问题和实现的链接:is_enum implementation

    【讨论】:

    • 编译器魔法可能是实现它的最简单和最好的方法,但这不是必需的,Boost 实现适用于没有编译器魔法的编译器。
    【解决方案3】:

    我没有详细遵循 Boost 代码,但它似乎使用了简单的消除:枚举不是算术(内置整数和浮点类型和指针),不是引用,不是函数,不是类或联合,也不是数组。

    【讨论】:

      猜你喜欢
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多