Можно ли предотвратить использование шаблона C ++ без специализации?
Например, у меня есть
template<class T>
void foo() {}
И я не хочу, чтобы он использовался без специализации на foo<int>
или же foo<char>
,
Вы должны иметь возможность объявлять функцию, не определяя ее в общем случае. Это приведет к тому, что ссылка на неспециализированный шаблон выдаст ошибку компоновщика Undefined Symbol.
template<class T>
void foo();
template<>
void foo<int>() {
// do something here
}
Это прекрасно работает для меня с clang++
,
Вы можете использовать неопределенный тип в теле функции. И вы получите время компиляции сообщение об ошибке:
template<class T> struct A;
template<class T>
void foo()
{
typename A<T>::type a; // template being used without specialization!!!
cout << "foo()\n";
}
template<>
void foo<int>()
{
cout << "foo<int>\n";
}
template<>
void foo<char>()
{
cout << "foo<char>\n";
}
int main()
{
foo<int>();
foo<char>();
// foo<double>(); //uncomment and see compilation error!!!
}
Это возможно, когда функция foo имеет параметр.
например: template void foo (T param) {}
Теперь вы можете вызывать foo (1), foo (‘c’) без специализации.