2012-09-11 31 views
3

是否可以防止未經專業化使用C++模板?是否可以防止沒有專門化的C++模板被使用?

例如,我有

template<class T> 
void foo() {} 

而且我不希望它是沒有被專門用於foo<int>foo<char>使用。

+1

呃,只是不使用模板? – DarenW

+2

@DarenW:您可以擁有仍然是通用的專用模板,例如'template void foo ()'專門用於任何指針類型。 –

+0

[如何防止非專用模板實例化?](http://stackoverflow.com/questions/7064039/how-to-prevent-non-specialized-template-instantiation) – mako

回答

8

您應該能夠聲明該函數,而無需在通用情況下實際定義它。這會導致對非專用模板的引用發出未定義符號鏈接器錯誤。

template<class T> 
void foo(); 

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

這對我來說很好用clang++

-1

當foo函數有參數時可能。 例如:template void foo(T param){} 現在,您可以調用foo(1),foo('c')而無需專門化。

1

您可以在函數主體中使用未定義的類型。你會得到編譯時錯誤消息:

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