gpt4 book ai didi

c++ - 自动 void * 到 C++ 类转换

转载 作者:太空宇宙 更新时间:2023-11-04 14:04:31 25 4
gpt4 key购买 nike

我正在尝试将一些 C++ 类绑定(bind)到 Lua。当使用单继承时这个问题很容易,但是当使用多继承时,就很难确定 void * 持有的类的类型。

Lua 只能通过空指针来管理用户的数据,所以当你有以下情况时:

#include <string>

class A {
public:
A() { }
~A() { }
};

class B {
private:
std::string m_name;
int m_count;

public:
B() { }
~B() { }
};

class C
: public A
, public B
{
private:
std::string m_title;

public:
C() { }
~C() { }
};

声明一个指向 C 的指针并将其转换为 B 会自动将指针对齐到类 C 中 B 的位置,如下所述:

int main()
{
C *c = new C();
B *b = c;

printf("c = %p, b = %p\n", c, b);

return 0;
}

输出:

$./a.outc = 0x801807040, b = 0x801807050

所以在这里,我们看到 B 类位于 A 的大小加上编译器添加的一些内部数据之后。

现在的问题是,如何使用模板自动将保存类的void *指针转换为所需的类型?我们现在唯一关于 void 指针的是它还包含一个带有类名的字符串,所以对于 A,我们有“A”,因此我们可以创建一种要使用的映射。

例如,我希望能够做类似的事情

B *b = castFromVoid<B>(myVoidPtr);

而且因为我知道 myVoidPtr 的类字符串设置为“C”或“B”,所以我确信它可以转换为 B,但我只需要有一个实际执行转换的函数对我来说,我没有找到任何使用模板的解决方案。

最佳答案

这会是你想要的吗?

template<typename T>
T *castFromVoid(void *ptr) {
return dynamic_cast<T *>(static_cast<A *>(ptr));
}

但是,您需要在编译器中启用 RTTI,并且在您的类中至少有一个虚方法(析构函数是一个很好的候选者,不是吗?)。

这假设您的所有类都将继承自同一个基类(此处为 A),因为 RTTI 无法在指向 void 的指针上执行。

关于c++ - 自动 void * 到 C++ 类转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17633238/

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