2015-03-03 57 views
3

我在C以下代碼++:最好的方法寫一個有條件選擇的構造

struct A; 

struct B 
{ 
    B(){} 

    template<typename T> 
    B(T param){} 
}; 

我希望它能在構造模板是有效的,只有當類型名T是敞篷的類型A。什麼是完成這個最好的方法?

+0

對不起,我混合C#和C++,我在兩種語言工作,我感到困惑。我只是編輯了問題以修復代碼。 – 2015-03-03 14:16:17

+0

請注意,根據我的經驗,MSVC2013在解決此問題的最佳做法方面存在問題。 – Yakk 2015-03-03 14:47:19

回答

10

你想使構造如果T可轉換A?使用std::enable_ifstd::is_convertible

template < 
    class T, 
    class Sfinae = typename std::enable_if<std::is_convertible<T, A>::value>::type 
> 
B(T param) {} 

此方法是,將SFINAE;如果T不能轉換爲A,則替換將失敗,構造函數將從候選重載集中移除。

+1

第二個模板參數並不需要名稱。但是我知道這很好 – 2015-03-03 14:03:58

+2

@BЈовић,但我通常使用這個名字作爲一些內聯文檔。 – Angew 2015-03-03 14:05:01

+0

結合該標準的註釋'14.8.1/7',我發現你的答案非常好。謝謝。 – 2015-03-03 16:05:29