boost :: is_enum如何工作

boost::is_enum how it works?

本文关键字:何工作 工作 is enum boost      更新时间:2023-10-16

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

#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;
}

我尝试探索源代码,但这太难了(宏 模板代码导航失败)。有人可以得到理论探索它的工作原理?我没有想法如何实现。

您遇到了很多宏,因为Boost在编译器内在之间为其支持的所有平台切换。例如,Visual C 定义__is_enum(T),如果Tenumfalse,它将返回true。MSDN具有此类内在列表,可视化C 实现类型特质支持。

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

编辑:
我发现了提升实施;它位于<boost_path>boosttype_traitsintrinsics.hpp中。在此文件中搜索此文件以查找BOOST_IS_ENUM,您将看到各种编译器实现的编译器。有趣的是,似乎所有这些都以__is_enum(T)的方式实现了这一特定。

boost::is_enumstd::is_enum一样实现。它需要一些编译器魔术。检查以下链接,该链接具有相同的问题和一个实现:IS_ENUM实现

我没有详细介绍升压代码,但是它似乎正在使用简单的消除:枚举是不是算术的(内置整数和浮点类型和指针)),不是引用,不是函数,不是类或联合,而不是数组。