我想定義模板函數,但不允許使用特定類型實例化。請注意,通常所有類型都是允許的,並且通用模板可以工作,我只想禁止使用一些特定的類型。禁止特定函數模板實例化
例如,在下面的代碼中,我希望阻止使用double
與模板。這實際上並不妨礙實例化,但是由於沒有定義函數而導致鏈接器錯誤。
template<typename T>
T convert(char const * in)
{ return T(); }
//this way creates a linker error
template<>
double convert<double>(char const * in);
int main()
{
char const * str = "1234";
int a = convert<int>(str);
double b = convert<double>(str);
}
該代碼只是一個演示,顯然轉換函數必須做更多的事情。
問題:在上面的代碼中,我怎麼能產生嘗試使用convert<double>
實例化時,編譯器錯誤?
我能找到的最接近的相關問題是How to intentionally cause a compile-time error on template instantiation它涉及一個類而不是函數。
我需要這樣做的原因是因爲我希望阻止的類型實際上會編譯並使用通用版本進行操作。然而,這不應該是該功能合同的一部分,並且可能在所有平臺/編譯器和未來版本中都不支持。因此,我想阻止使用它。
您已經這樣做了,是嗎? – Nawaz 2011-04-22 11:00:07
不,這會導致關於缺少函數的鏈接器錯誤。這個錯誤不會告訴你問題在哪裏,它只會告訴你它在哪個模塊中。 – 2011-04-22 11:05:20
你可以使用'static_assert'觸發一個編譯時錯誤:'template <> foo(const char *) {static_assert(false,「不允許」); }' –
evnu
2011-04-22 11:10:38