2015-03-03 49 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