繁体   English   中英

在Boost.Python中向下倾斜

[英]Downcast in Boost.Python

编辑:纠正“upcast”为“低调”。

当我正在使用的类来自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)
    ...
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM