是否可以防止未經專業化使用C++模板?是否可以防止沒有專門化的C++模板被使用?
例如,我有
template<class T>
void foo() {}
而且我不希望它是沒有被專門用於foo<int>
或foo<char>
使用。
是否可以防止未經專業化使用C++模板?是否可以防止沒有專門化的C++模板被使用?
例如,我有
template<class T>
void foo() {}
而且我不希望它是沒有被專門用於foo<int>
或foo<char>
使用。
您應該能夠聲明該函數,而無需在通用情況下實際定義它。這會導致對非專用模板的引用發出未定義符號鏈接器錯誤。
template<class T>
void foo();
template<>
void foo<int>() {
// do something here
}
這對我來說很好用clang++
。
當foo函數有參數時可能。 例如:template void foo(T param){} 現在,您可以調用foo(1),foo('c')而無需專門化。
您可以在函數主體中使用未定義的類型。你會得到編譯時錯誤消息:
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!!!
}
呃,只是不使用模板? – DarenW
@DarenW:您可以擁有仍然是通用的專用模板,例如'template void foo ()'專門用於任何指針類型。 –
[如何防止非專用模板實例化?](http://stackoverflow.com/questions/7064039/how-to-prevent-non-specialized-template-instantiation) – mako