检测单个枚举常量的类型

Tem*_*Rex 5 c++ enums c++11 type-deduction c++14

下面的代码打印unsigned int为内部所有常量的基础类型enum Test

#include <iostream>
#include <type_traits>
#include <typeinfo>
#include <cxxabi.h>

struct Test 
{
    enum { a = true, b = 1 };    
};

static_assert(std::is_same<
    std::underlying_type_t<decltype(Test::a)>, 
    std::underlying_type_t<decltype(Test::b)>>::value, ""
);

int main()
{    
    int status;
    auto const& bi = typeid(std::underlying_type_t<decltype(Test::a)>);
    std::cout << abi::__cxa_demangle(bi.name(), 0, 0, &status); // unsigned int
}
Run Code Online (Sandbox Code Playgroud)

实例.如果Test包含两个单独的enumsab以前一样,也会发生这种情况.

:是否有可能检测到Test::a与初始化boolTest::bint?在C++ 17的任何反思研究组提案中是否有任何实验代码?

:我知道我可以解决它通过更换Test

struct Test
{
    static constexpr auto a = true;
    static constexpr auto b = 1;
};
Run Code Online (Sandbox Code Playgroud)

但我觉得这个enum版本的用法略显冗长.

Dan*_*rey 4

这是不可能的,而且我认为这也是不可能的。

原因是ab是 (在您的情况下为 unnamed) 的值enum。因此,根据定义,它们属于 的类型enum,意思是:属于同一类型。用于初始化它们及其各自类型的表达式仅用于“计算” 的基础类型enum,而不是任何单独值的基础类型。

考虑到这一事实,我认为即使反射也无助于恢复信息,因为当您查看 anenum的值时,初始化表达式的类型被抽象掉了。

您需要的是更深层次的检查,您需要访问用于初始化值的表达式。这意味着编译器必须为每个变量、值等存储大量附加信息(因为这不仅仅是enums 的通用信息)。

考虑一下这意味着什么:

  • 增加编译时间
  • 编译时增加内存使用
  • 现在每个值实际上都有两种类型,它被声明为的类型和它初始化的表达式的类型

最后一点是我认为该语言真正的灾难。值应该具有单一类型,用于初始化该值的表达式不应该以任何方式访问。这就是抽象的含义,破坏它可能会导致各种微妙的依赖关系和大量的复杂性。

免责声明:这只是我个人的观点,我不能代表委员会或工作组中的任何人。