gpt4 book ai didi

c++ - 与 C++/CLI 和模板的协变

转载 作者:行者123 更新时间:2023-11-28 07:33:28 24 4
gpt4 key购买 nike

我正在尝试在我的 native 库和我的 C# 客户端代码之间架起一座桥梁。

为此,我有一个名为“IHasManagedWrapper”的接口(interface):

#ifndef IHASMANAGEDWRAPPER_H_
#define IHASMANAGEDWRAPPER_H_

template <typename T>
class IHasManagedWrapper
{
public:
virtual T^ CreateManagedWrapper() = 0;
};

#endif

然后,为了测试返回的 CLI 类型的多态性,我创建了两个 native 类,Parent 和 Child,其中 Child 继承自 Parent:

家长:

#ifndef PARENT_H_
#define PARENT_H_

#include "IHasManagedWrapper.h"

ref class CLIParent;

class Parent : public IHasManagedWrapper<CLIParent>
{
public:
Parent();
~Parent();

virtual char* GetName();

virtual CLIParent^ CreateManagedWrapper();
};

#endif

child :

#ifndef CHILD_H_
#define CHILD_H_

#include "Parent.h"
#include "IHasManagedWrapper.h"

ref class CLIChild;

class Child : public Parent, IHasManagedWrapper<CLIChild> // uh-oh...
{
public:
char* GetName();

CLIChild^ CreateManagedWrapper();
}; // error C2555: 'Child::CreateManagedWrapper': overriding virtual function return type differs and is not covariant from 'Parent::CreateManagedWrapper'


#endif

我通过将“CLIChild”更改为“CLIParent”并从 IHasManagedWrapper 中删除 CLIChild 的继承来使其工作,但这意味着每次我调用 Child->CreateManagedWrapper() 时,我都会得到一个 CLIParent 对象,然后我需要手动转换为 CLIChild 对象。

CLIChild^ child = safe_cast<CLIChild^>(pChild->GetManagedWrapper()); // pChild->GetManagedWrapper() returns a CLIParent^ object

虽然这还不错,但有没有办法让 CLIChild->CreateManagedWrapper() 返回一个 CLIChild 对象,同时保留 IHasManagedWrapper 接口(interface)?

谢谢!

最佳答案

您可以通过将重载虚方法的主体转移到特定方法中来解决这个问题,比如 Child::CreateManagedWrapperChild ,然后在您知道正在处理 Child 时调用该特定方法.重载的虚拟方法将简单地调用特定方法并将其结果向上转换为 CLIParent匹配正确的方法签名。

class Child : public Parent {
public:
char* GetName();
CLIParent^ CreateManagedWrapper() { return CreateManagedWrapperChild(); }
CLIChild^ CreateManagedWrapperChild(); // actual code in this method
};

这看起来不像您希望编写的那样干净,但它被编译器接受并且在实践中应该仅用于一个继承级别就可以很好地工作。对于不止一个,你必须制作 CreateManagedWrapperChild也是虚拟的,以同样的方式重载它说GrandChild , 并重载原始虚方法直接调用 CreateManagedWrapperGrandChild方法,以避免嵌套的虚拟调用。

但是,对于一个大的继承树,这种技术不是很实用,因为特定虚方法的爆炸。

关于c++ - 与 C++/CLI 和模板的协变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204835/

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