特殊化せずにC++テンプレートが使用されるのを防ぐことは可能ですか?
たとえば、私は
template<class T>
void foo() {}
foo<int>
そして、またはに特化せずに使用したくありませんfoo<char>
。
特殊化せずにC++テンプレートが使用されるのを防ぐことは可能ですか?
たとえば、私は
template<class T>
void foo() {}
foo<int>
そして、またはに特化せずに使用したくありませんfoo<char>
。
一般的なケースでは、実際に関数を定義せずに関数を宣言できるはずです。これにより、特殊化されていないテンプレートへの参照により、未定義のシンボル リンカ エラーが発生します。
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') を呼び出すことができます。