gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:04:49 27 4
gpt4 key购买 nike

我的印象是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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com