2010-11-28 56 views
2

我有一個模板功能,我希望在不同的地方爲不同類型的模板化。
問題是,我想知道在編譯時是否有專門的給定類型以兩種不同的方式生成另一個模板。C++模板可以檢查給定類型的函數是否被重載?

template<typename T> 
bool tobool(const T&){ throw Exception("Can't cast to bool");}; 
template<> bool tobool<bool>(const bool &value){ return value;} 

我知道你可以像here那樣測試函數存在。

有關如何測試tobool是否專用的任何機會?

想象一下,我想要生成一個isbool(),如果tobool()已經被專門化了,它將返回true,否則返回false。

+1

我理解正確嗎? :你想要一個爲每種類型T表示的元函數,表明tobool是否專門用於T? – 2010-11-28 20:33:20

+0

是的,我需要知道T是否使用通用或專用的tobool。 – 2010-11-28 20:34:27

回答

3

這樣(有點醜陋而脆)的解決方法,你可能需要一個結構,而不是一個功能的專業化,包括類常量指示結構是否已專門:

template <typename T> 
struct ToBool { 
    static bool tobool(const T&); 
    static const bool specialized = false; 
}; 

另一種選擇僅在專業化中定義tobool。這樣,ToBool<Foo>::tobool(f)將不會編譯爲ToBool尚未專門爲任何類Foo

作爲tobool的替代方法,如果您可以控制要轉換的類,則可以使用顯式轉換運算符。

class Foo { 
public: 
    operator bool(); 
    ... 
}; 
... 
    Foo f; 
    if (f) ... 

如果類型不具有布爾轉換(以及,轉換爲數值或指針類型,兩者都具有標準轉換到bool),該程序將不編譯。瞧,編譯時間檢查轉換。

如果你不想隱式轉換爲bool,你可以定義一個操作符!並使用double-bang進行顯式轉換(雖然這不可讀):

class Foo { 
public: 
    bool operator!(); 
    ... 
}; 

... 
    Foo f; 
    if (!!f) ... 
0

您的具體問題的答案是這樣的:不,您無法檢查T是使用主模板還是專用模板。馬丁約克的問題是一個非常好的問題:你爲什麼要檢查? :)

相關問題