我在C以下代碼++:最好的方法寫一個有條件選擇的構造
struct A;
struct B
{
B(){}
template<typename T>
B(T param){}
};
我希望它能在構造模板是有效的,只有當類型名T
是敞篷的類型A
。什麼是完成這個最好的方法?
我在C以下代碼++:最好的方法寫一個有條件選擇的構造
struct A;
struct B
{
B(){}
template<typename T>
B(T param){}
};
我希望它能在構造模板是有效的,只有當類型名T
是敞篷的類型A
。什麼是完成這個最好的方法?
你想使構造如果T
可轉換到A
?使用std::enable_if
和std::is_convertible
:
template <
class T,
class Sfinae = typename std::enable_if<std::is_convertible<T, A>::value>::type
>
B(T param) {}
此方法是,將SFINAE;如果T
不能轉換爲A
,則替換將失敗,構造函數將從候選重載集中移除。
第二個模板參數並不需要名稱。但是我知道這很好 – 2015-03-03 14:03:58
@BЈовић,但我通常使用這個名字作爲一些內聯文檔。 – Angew 2015-03-03 14:05:01
結合該標準的註釋'14.8.1/7',我發現你的答案非常好。謝謝。 – 2015-03-03 16:05:29
對不起,我混合C#和C++,我在兩種語言工作,我感到困惑。我只是編輯了問題以修復代碼。 – 2015-03-03 14:16:17
請注意,根據我的經驗,MSVC2013在解決此問題的最佳做法方面存在問題。 – Yakk 2015-03-03 14:47:19