在Boost.Python中向下倾斜

时间:2012-08-31 21:43:00

标签: c++ python boost boost-python

编辑:纠正“向上倾斜”是“向下倾斜”。

当我正在使用的类来自C ++时,我正试图找出在Python中进行向下转换的最佳方法。如果我在C ++中定义了两个类:

struct Base
{
    int foo()
    {
        return 7;
    }
};

struct Derived : Base
{
    int bar()
    {
        return 42;
    }
};

另一个功能

Base baz()
{
    return Derived();
}

如果我尝试使用Python

der = baz()
print der.foo()
print der.bar()

对bar()的调用失败,因为Python只知道Base中的函数。

我的解决方案是为Derived添加另一个函数:

Derived * fromBase(Base * b)
{
    return reinterpret_cast<Derived *>(b);
}

如果我然后将Python脚本的第一行更改为der = Derived.fromBase(baz()),则脚本将按预期工作。

但是,我使用reinterpret_cast来完成这项工作似乎非常错误。有没有更好的方法来进行向下转换,不需要使用像reinterpret_cast这样危险的东西?如果没有,fromBase()的退货政策应该是什么?

在有人问之前,是的,堕落是必要的。这就是我必须使用的库。

编辑:

我正在寻找像这个C#代码一样的东西:

Base b = new Derived();
Derived d = b as Derived;
if (d != null)
    ...

1 个答案:

答案 0 :(得分:1)

Base baz()
{
    return Derived();
}

从返回类型可以看出,这会返回一个Base对象,不是一个Derived对象。所以没有什么可以向下倾斜(而不是向上)。所以你首先要解决这个问题。

更重要的是,你是对的,reinterpret_cast在这种背景下肯定是阴暗的。 dynamic_cast实际上是用于向下转换的工具。

更基本的是,你应该问问自己为什么你觉得需要一个沮丧的人。您的示例代码可能是合成的,并不能代表您的确切问题,但为什么不能baz返回Derived


以下是您的代码段的等效内容:

Derived d;
Base& b = d;
if(Base* p = dynamic_cast<Derived*>(&b))
    // okay; b is actually an instance of Derived