作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
下面的代码打印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
也会发生这种情况包含两个独立的 enum
与 a
和 b
和以前一样。
问题:是否有可能检测到Test::a
用 bool
初始化和 Test::b
与 int
? Reflection Study Group 的任何 C++17 提案中是否有这方面的实验代码?
注意:我知道我可以通过替换 Test
来解决它与
struct Test
{
static constexpr auto a = true;
static constexpr auto b = 1;
};
但我找到了 enum
版本的用法稍微不那么冗长。
最佳答案
这不可能,而且我认为它永远不可能实现。
原因是 a
和 b
是(在您的情况下未命名)enum
的值。因此,根据定义,它们属于 enum
类型,意思是:属于同一类型。用于初始化它们和它们各自类型的表达式仅用于“计算”enum
的基础类型,而不是任何单个值的基础类型。
考虑到这个事实,我认为即使是反射也无助于恢复信息,因为当您查看 enum
的值时,初始化表达式的类型被抽象掉了。
您需要的是更深层次的检查,您需要在其中访问用于初始化值的表达式。这意味着编译器必须为每个变量、值等存储大量附加信息(因为这不仅是enum
的通用信息)。
想想这意味着什么:
最后一点是我认为该语言真正的灾难。一个值应该有单一类型,用于初始化该值的表达式不应该以任何方式访问。这就是抽象的意义所在,打破它可能会导致各种微妙的依赖关系和大量的复杂性。
免责声明:这只是我的个人意见,我不能代表委员会或工作组中的任何人。
关于c++ - 检测单个枚举常量的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24477204/
我是一名优秀的程序员,十分优秀!