Мой вопрос: возможно ли также определить весь основной шаблон посредством отражения? Или, может быть, есть способ автоматически определять каждую конкретизированную специализацию шаблона?
Справочная информация:
Я очень воодушевлен предстоящим отражением в C++26, поэтому я немного поигрался с ним в Godbolt, используя сборку отражения clang.
В качестве упражнения я попытался создать именованный кортеж. В частности, я хотел, чтобы имена предоставлялись пользователем, а типы определялись, например:
Код: Выделить всё
Named::Tuple{ .a = 42, .b = "Hello" }; // -> deduces
Я попробовал это специально, потому что мне было интересно, возможна ли именованная библиотека форматирования с отражение. То есть
Код: Выделить всё
format({ .name = "World" });
Попытка 1:
Код: Выделить всё
template
struct Named {
template
struct Tuple;
template
static consteval bool instantiate() {
define_aggregate(^^Tuple, {
data_member_spec(^^Ts, { .name = Names.data })...
});
return true;
}
template
requires (instantiate())
Tuple(Ts&&...) -> Tuple;
};
Код: Выделить всё
:18:9: note: cannot produce an injected declaration from a non-plainly constant-evaluated context
18 | define_aggregate(^^Tuple, {
Попытка 2:
Код: Выделить всё
template
struct Named {
template
struct Inner {
struct Tuple;
consteval {
define_aggregate(^^Tuple, {
data_member_spec(^^Ts, { .name = Names.data })...
});
}
};
template
using Tuple = Inner::Tuple;
template
Tuple(Ts&&...) -> Tuple;
};
Код: Выделить всё
:54:5: error: alias template 'Named::Tuple' requires template arguments; argument deduction only allowed for class templates or alias templates
54 | Named::Tuple{ .a = 42, .b = "Hello" };
Я также пробовал использовать производные от Inner::Tuple вместо псевдонима, чтобы иметь возможность предоставить руководство, но тогда назначенный синтаксис инициализации больше не работает.
Подробнее здесь: https://stackoverflow.com/questions/798 ... e-template
Мобильная версия