boost :: is_enum是如何工作的?

时间:2012-10-26 07:28:16

标签: c++ boost typetraits

我很有意思这件事是如何在理论上起作用的。 例如:

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

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

3 个答案:

答案 0 :(得分:7)

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

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

修改
我找到了Boost实现;它位于<boost_path>\boost\type_traits\intrinsics.hpp。在此文件中搜索此文件以查找BOOST_IS_ENUM,您将看到各种编译器实现的编译器内在函数。有趣的是,它们似乎都是__is_enum(T)

答案 1 :(得分:2)

boost::is_enum的实施方式与std::is_enum相同。它需要一些编译魔术。请查看以下具有相同问题的链接和实施:is_enum implementation

答案 2 :(得分:1)

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