1.at Время компиляции, рассчитайте общее количество переменных элементов, «постепенно пытаясь создать класс агрегата». < /p>
для каждого члена. < /p>
3.3.1. Включите указатель элемента в шаблон функции, получите имя функции, используя std :: source_location в прицеле шаблона и проанализируйте имя переменной элемента. < /p>
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
template
struct reflect_member_handler {};
struct type_placeholder
{
template
operator E() const;
};
template
consteval static std::size_t aggregate_member_counter()
{
if constexpr( !requires{ T{ Args{}... }; } )
return sizeof...(Args) - 1;
else
return aggregate_member_counter();
}
template
consteval std::size_t get_member_count() {
return aggregate_member_counter();
}
template
std::string_view Iget_member_name()
{
static std::source_location location = std::source_location::current();
std::string_view func_name = location.function_name();
std::size_t first = func_name.find("::", func_name.find("(&")) + 2;
std::size_t last = func_name.find(")", first);
return func_name.substr(first, last - first);
}
#if 0
//----------------------- Part 1----------------------------
template
struct reflect_member_handler
{
static auto get_member_names()
{
static T object;
static auto& [v0] = object;
std::array names;
names[0] = Iget_member_name();
return names;
}
};
//----------------------------------------------------------
#else
//----------------------- Part 2----------------------------
template
struct reflect_member_handler
{
static auto get_member_names()
{
static std::byte memory[sizeof(T)];
static T& dummy_object = *reinterpret_cast(memory);
static auto& [v0] = dummy_object;
std::array names;
names[0] = Iget_member_name();
return names;
}
};
//----------------------------------------------------------
#endif
struct test_t { int a; };
int main()
{
auto member_names =
reflect_member_handler::get_member_names();
std::cout
Эта проблема не является ошибкой, связанной с именованием. Как мне объяснить эту проблему?#include
#include
template
void test2() {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79744696/an-internal-compiler-error-ice-is-encountered-with-gcc-and-compiling-with-cla[/url]