2012-10-09 344 views
1

我有我使用boost :: variant的以下方法。我嘗試根據類型T獲取價值。如果boost::get<T>失敗,我想用特殊的方式處理它,如果T是一個int或unsigned int。有什麼辦法可以知道T是int還是unsigned int?從模板值獲取類型,C++

我不認爲我可以在這種情況下使用模板專業化,我可以嗎?

編輯:另外,我還沒有進入C++ 11(很快我希望)

template < typename T, typename C, void (C::*setterFcn)(const T&) > 
void binder(const Variant& value_var, C* c) 
{ 
    const T* typeData = boost::get<T>(&value_var); 

    if (NULL == typeData) 
    { 
     // Need to check for int or unsigned int here somehow 
    } 

    (((C*) c)->*(setterFcn))(*typeData); 
} 
+1

類似'std :: is_same :: value'?或者只是將'int'的整個事物專門化。 –

+0

我不相信我可以爲此做部分模板專業化,我可以嗎? –

+0

@NicFoster:不,因爲不能部分地專門化一個函數模板。但是,您可以使用_overloading_輕鬆完成此操作。 – ildjarn

回答

4

在C++ 11可以使用std::is_same和C++ 03,你可以做這樣的事情:

template <typename T1, typename T2> 
class is_same 
{ 
public: 
    static bool const value = false; 
}; 

template <typename T> 
class is_same<T, T> 
{ 
public: 
    static bool const value = true; 
}; 

,準確地把它作爲C++ 11標準版本。

+0

Griwes,感謝您的編輯。我剛剛閱讀文檔,想要更新到您提出的內容。這種過渡到C++ 11將是無痛的。 – detunized

1

最簡單的方法可能是隻是委託給重載函數或函數模板:您指定的一般處理,可能什麼都不做,在一個功能和在兩個單獨的專門處理或者功能(如果額外的處理是微不足道的)或enable_if ed函數的條件檢查intunsigned int