#c #templates #template-specialization #specialization
Вопрос:
Я хотел бы написать шаблонизированную функцию с двумя типами шаблонов: один bool и один с именем типа, и я хотел бы специализироваться на имени типа.
например, это то, что я хочу, но специализируюсь только на паре типов для T:
template<bool b, typename T>
void foo(T val)
{
// do different stuff based on b and type of T.
}
без була там я могу сделать что-то вроде этого:
template<typename T>
void bar(T val) {
static_assert(false, "not implemented");
}
template<>
void bar<short>(short val) {
printf("it's a short!n");
}
Я не могу понять синтаксис для этого, и документы Microsoft по специализации охватывают только однотипный случай.
Комментарии:
1. Насколько я знаю, частичная специализация поддерживается только в классах. Для работы вы должны полностью специализироваться. Обходной путь состоит в том, чтобы иметь функцию, которая в таких случаях вызывает класс. Функция может вызывать статическую функцию внутри шаблонного класса, возможно, с теми же параметрами шаблона, что и функция. Затем вы можете терпеливо или полностью специализироваться на этом классе.
Ответ №1:
template<bool B, typename T>
void foo(T constamp;)
{
static_assert(false, "not implemented");
}
template<bool B>
void foo(short)
{
printf("it's a short!n");
}
Однако на самом деле это не специализация, а перегрузка, которая вполне уместна. На самом деле, вы могли бы опустить общий случай.
Комментарии:
1. Спасибо! Я также понял, что в моем конкретном случае мне вообще не нужно создавать шаблоны на T, но это может просто перегрузить.