Можно ли использовать incomplete типы в специализациях шаблона?
Валидно ли использовать неполные типы в специализациях, определяя их не в хедерах, а в сорсах? Следующий пример компилируется, но не уверен что так можно
struct A;
namespace fmt{
template<>
struct formatter<A> : formatter<int> {
auto format(A a, format_context& ctx) const;
};
}
struct A {
int x=42;
};
namespace fmt{
auto formatter<A>::format(A a, format_context& ctx) const {
return formatter<int>::format(a.x, ctx);
}
}
Ответы (1 шт):
Автор решения: HolyBlackCat
→ Ссылка
Да, так можно.
Тут два отдельных вопроса:
Можно ли специализировать incomplete типом? - Конечно да.
(Непонятно как можно доказать отсутствие запрета, но есть же типы, которые никогда не могут быть complete:
void
,T[]
(массив без указания размера). Для них тоже хочется делать специализации.)Можно ли объявлять функцию с incomplete аргументом? Тут был не уверен, но экспериментально проверяется, что тоже можно (причем даже снаружи шаблона).