能否利用C++26反射实现default_member_initializer_of?
C++26反射实现
default_member_initializer_of C26标准库的std::meta::has_default_member_initializer仅能判断非静态数据成员是否带有默认初始化器,但未提供直接获取该初始化器值的配套工具。借助C26反射的get_default_member_initializer和constant_of,可以实现符合需求的default_member_initializer_of,不过仅支持常量表达式类型的默认初始化器。
实现代码
#include <meta> #include <concepts> namespace my_meta { template<std::meta::info M> requires std::meta::is_non_static_data_member(M) && std::meta::has_default_member_initializer(M) constexpr auto default_member_initializer_of(M) { // 获取成员默认初始化器的反射信息 auto init_reflect = std::meta::get_default_member_initializer(M); // 静态断言确保初始化器是常量表达式,否则无法编译期提取值 static_assert(std::meta::is_constant_expression(init_reflect), "目标成员的默认初始化器不是常量表达式,无法提取值"); // 提取初始化器的常量值 return std::meta::constant_of(init_reflect); } }
验证示例
struct test { int value = 42; }; // 验证成员存在默认初始化器 static_assert(std::meta::has_default_member_initializer(^^test::value)); // 验证提取的默认初始化值正确 static_assert(my_meta::default_member_initializer_of(^^test::value) == 42);
注意事项
- 若成员的默认初始化器不是常量表达式(比如调用了非
constexpr函数、依赖运行时数据),则constant_of无法提取值,静态断言会触发错误。 - 你之前尝试
constant_of失败,大概率是因为没有通过get_default_member_initializer正确获取到初始化器的反射信息,或是忽略了初始化器必须为常量表达式的前提。
内容的提问来源于stack exchange,提问作者Dnarok
相关产品推荐
相关产品推荐

