c++ - 基于unique_ptr参数指针类型的重载函数

标签 c++ overloading hierarchy unique-ptr

我的印象是unique_ptr可以以与普通指针相同的方式推断类层次结构,但是当我尝试重载这样的函数时:

void func(unique_ptr<Derived1>& d1);
void func(unique_ptr<Derived2>& d2);
然后调用这样的函数之一:
unique_ptr<Base> b = make_unique<Derived1>();
func(b);    
我收到一条错误消息,说 no instance of overloaded function "func" matches the argument list . b 的运行时类型为 Derived1 ,所以我预计会调用第一个重载。
另外,当我返回 unique_ptr从函数中,编译器能够将派生类(?不确定适当的术语)转换为基类,这样这样的东西就可以工作:
unique_ptr<Base> create(){
    return make_unique<Derived1>();
}
通常在我的代码中,我将变量声明为此类函数的结果。它们被声明为基类,但具有派生的运行时类型,我想将它们传递给一个重载函数。
如何以与涉及类层次结构的常规指针相同的方式重载函数?

最佳答案

你是对的,所有标准智能指针的隐式转换操作都是对原始指针的建模。这允许编译第二个片段,即

unique_ptr<Base> create(){
    return make_unique<Derived1>();
}
但是,对第一个片段存在误解,因为从基类到派生类从来没有内置的隐式向下转换。使用普通指针,
void func(Derived1* d1);
void func(Derived2* d2);

Base* b =  new Derived1();
func(b);
也不会编译。这在基本的 OOP 意义上是有意义的——通过基类接口(interface)查看继承层次结构中的对象,并隐藏实际的具体运行时类型。
如果您需要具有这种分派(dispatch)的设计,您想了解“访问者”设计模式,它实现了一种称为双重(或多重)分派(dispatch)的技术。但是,实现这一点所需的样板文件的数量给了你一个提示,为什么该语言不提供这种作为内置的调度。

关于c++ - 基于unique_ptr参数指针类型的重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67871126/

相关文章:

c++ - 如果我们将静态数据混合到实例类中,性能会受到影响吗?

c++ - 编译器如何选择正确的函数?

sql - 在 SQL Server 中创建数据层次结构

types - Agda中的类型层次结构

c++ - 使用 GLFW3 创建 OpenGL 4.3 窗口失败

c++ - 从 C++ 二进制搜索树中删除一个节点(类不是结构)

C# 泛型 : Can I combine overloaded methods into one with different return/input data types?

haskell - 如何使用实例组织 Haskell 模块 : stick to data type vs type class?

c++ - 如何遍历类指针的 vector

c++ - 可变模板函数重载失败