我在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