gpt4 book ai didi

c++ - 检测单个枚举常量的类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:40 25 4
gpt4 key购买 nike

下面的代码打印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
}

Live Example .如果 Test 也会发生这种情况包含两个独立的 enumab和以前一样。

问题:是否有可能检测到Test::abool 初始化和 Test::bint ? Reflection Study Group 的任何 C++17 提案中是否有这方面的实验代码?

注意:我知道我可以通过替换 Test 来解决它与

struct Test
{
static constexpr auto a = true;
static constexpr auto b = 1;
};

但我找到了 enum版本的用法稍微不那么冗长。

最佳答案

不可能,而且我认为它永远不可能实现。

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

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

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

想想这意味着什么:

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

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

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

关于c++ - 检测单个枚举常量的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24477204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com