另外,std::index_sequence<Is ...>可以用g++ 16.1已经支持的template for来替代了,可读性要好些,我以前在编程技术版发的那个可变参数模板的匿名函数迭代也可以改成template for循环。
@buildtolast 当时不写循环还真不是我炫技,那时候运行时循环变量不能作为下标去索引 constexpr 数组(除非编译器支持template for 或者 consteval for,当前尚未标准化)。
因此必须通过编译期索引序列展开(index_sequence + 折叠表达式)来实现“遍历”。
template<typename T>
void print_fields_by_template_for(const T& obj) {
constexpr auto N = std::meta::nonstatic_data_members_of(
^^T, std::meta::access_context::unchecked()
).size();
std::println("Processing object of type: {} ({} fields)",
std::meta::display_string_of(^^T), N);
constexpr auto members =
std::define_static_array(
nonstatic_data_members_of(
^^T, std::meta::access_context::unchecked()
)
);
template for (constexpr std::size_t i : std::views::iota(0uz, N)) {
constexpr auto member = members[i];
constexpr auto name = std::meta::identifier_of(member);
auto const& value = obj.[: member :]; // 拼接成员访问
print_value(name, value, i);
}
}
--
FROM 171.213.178.*