#c #templates #template-specialization #template-instantiation
#c #шаблоны #шаблон-специализация #шаблон-создание экземпляра
Вопрос:
У меня есть шаблон класса с некоторыми псевдонимами шаблонов. Поскольку я использую только закрытый набор типов в шаблоне, я хотел бы специализироваться и явно создавать их экземпляры. В настоящее время у меня есть это:
// Header
template <typename T>
struct Literal {
Literal(std::string_view);
};
using StringLiteral = Literal<std::string>;
// Source:
StringLiteral::Literal(std::string_view){/*...*/}
Я предполагал, что мне понадобится extern template StringLiteral
или что-то в этом роде, но это, кажется, работает. Я могу использовать StringLiteral
в совершенно другом TU, отличном от того, в котором находится специализация.
Мой вопрос в том, законно ли это? И если да, то почему не требуется явное создание экземпляра? Мы не смогли неявно создать экземпляр шаблона в другом TU, поскольку у нас нет определения для конструктора.
Кроме того, использование псевдонима шаблона для специализации кажется мне странным, правильно ли это?
Комментарии:
1. Кажется, я помню, что компоновщик видит несколько реализаций класса template, предполагает, что все они одинаковы, выбирает одну и отбрасывает остальные, если вам повезет, он выберет правильную