7

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

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

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

4

3 回答 3

7

您会遇到很多宏,因为 Boost 在它支持的所有平台的编译器内在函数之间切换。例如,Visual C++ 定义了if是 an ,否则__is_enum(T)返回。MSDN列出了 Visual C++ 为支持类型特征而实现的此类内在函数。trueTenumfalse

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

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

于 2012-10-26T07:49:38.097 回答
2

boost::is_enum is implemented like std::is_enum. It requires some compiler magic. Check the following link which has the same question, and an implementation: is_enum implementation

于 2012-10-26T07:45:17.677 回答
1

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

于 2012-10-26T08:07:50.623 回答