Можно ли предотвратить использование шаблона C ++ без специализации?

Можно ли предотвратить использование шаблона C ++ без специализации?

Например, у меня есть

template<class T>
void foo() {}

И я не хочу, чтобы он использовался без специализации на foo<int> или же foo<char>,

3

Решение

Вы должны иметь возможность объявлять функцию, не определяя ее в общем случае. Это приведет к тому, что ссылка на неспециализированный шаблон выдаст ошибку компоновщика Undefined Symbol.

template<class T>
void foo();

template<>
void foo<int>() {
// do something here
}

Это прекрасно работает для меня с clang++,

8

Другие решения

Вы можете использовать неопределенный тип в теле функции. И вы получите время компиляции сообщение об ошибке:

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!!!
}
1

Это возможно, когда функция foo имеет параметр.
например: template void foo (T param) {}
Теперь вы можете вызывать foo (1), foo (‘c’) без специализации.

-1
По вопросам рекламы [email protected]