Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我如何制作C++;是否希望匹配父类重载而不是模板?_C++_Templates_Casting_Class Hierarchy - Fatal编程技术网

C++ 我如何制作C++;是否希望匹配父类重载而不是模板?

C++ 我如何制作C++;是否希望匹配父类重载而不是模板?,c++,templates,casting,class-hierarchy,C++,Templates,Casting,Class Hierarchy,但我不想那样做 为什么C++更倾向于使用模板而不是隐式地将 C > 父和< /代码>? 我是否可以将类更改为更喜欢强制转换而不是模板化,这样就不需要解决方法了?一种解决方案是通过SFINAE禁用模板构造函数: Foo foo ((Parent&) c); 模板< 类型名T, std::如果\u t>*=0,则启用\u > Foo(const T&); 编译器更喜欢选择带有T=child的模板构造函数,因为重载解析认为限定转换(将const添加到参数类型)优于派生到基的转换 因此,最简单

但我不想那样做

为什么C++更倾向于使用模板而不是隐式地将<代码> C<代码> > <代码>父和< /代码>?
我是否可以将类更改为更喜欢强制转换而不是模板化,这样就不需要解决方法了?

一种解决方案是通过SFINAE禁用模板构造函数:

Foo foo ((Parent&) c);
模板<
类型名T,
std::如果\u t>*=0,则启用\u
>
Foo(const T&);

编译器更喜欢选择带有
T=child
的模板构造函数,因为重载解析认为限定转换(将
const
添加到参数类型)优于派生到基的转换

因此,最简单的方法就是声明一个构造函数,并将一个子元素作为参数:

template <
    typename T,
    std::enable_if_t<!std::is_base_of_v<Parent, T>> * = 0
>
Foo (const T &);
class-Foo
{
公众:
Foo(父母&){};
Foo(Child&x):Foo(static_cast(x)){};
模板
Foo(const T&);
};

请注意,如果构造函数的参数是常量左值或右值,那么就像在示例代码中一样,将选择模板构造函数。我想这是故意的。

虽然
孩子
是一个
家长
,但仍然没有与
家长&
直接匹配。因此,模板化版本是更好的匹配
。类似:也可以玩
const
,作为
const父对象;Foo{parent}
不匹配任何构造函数(OP使用
Foo(Parent&)
Foo(const T&)
Foo
不知道
Parent
的任何子类
template <
    typename T,
    std::enable_if_t<!std::is_base_of_v<Parent, T>> * = 0
>
Foo (const T &);
class Foo
{
public:

    Foo (Parent &) {};

    Foo (Child & x):Foo(static_cast<Parent&>(x)) {};

    template <typename T>
    Foo (const T &);
};