gpt4 book ai didi

c++ - 如何使用 boost.python 导出复杂类

转载 作者:太空狗 更新时间:2023-10-29 23:16:53 25 4
gpt4 key购买 nike

我有一个事件类,我试图使用 Boost.Python 在 python 中访问它。下面是 list ,以及关联的宏和一个示例派生事件类。

class Event
{
private:
unsigned __int64 m_TimeStamp;

public:
// Empty parameter struct used as base for event parameters
// in derived classes.
struct Params { };

Event();

virtual unsigned int Type() const = 0;
virtual const char* TypeName() const = 0;

unsigned __int64 TimeStamp() const { return m_TimeStamp; }
};

typedef shared_ptr<Event> EventPtr;

#define DECLARE_EVENTTYPE(typeName, id) \
enum { TYPE = id }; \
unsigned int Type() const { return static_cast<unsigned int>(id); } \
const char* TypeName() const { return typeName; }

// Macro used to declare the start of an event parameters structure
#define START_EVENTPARAMS() struct Params : public Event::Params {

// Macro used to finish the event parameters structure declaration
#define END_EVENTPARAMS(eventName) \
} m_Params; \
eventName(const Event::Params* pkParams = NULL) : Event() \
{ \
if (NULL != pkParams) \
{ \
const eventName::Params* pkEventParams = \
reinterpret_cast<const eventName::Params*>(pkParams); \
if (NULL != pkEventParams) \
m_Params = *pkEventParams; \
} \
} \
static const eventName::Params& Parameters(const EventPtr pkEvent) \
{ \
const shared_ptr<eventName> pkErrorEvent( \
dynamic_pointer_cast<eventName>(pkEvent)); \
return pkErrorEvent->m_Params; \
}

// Macro used for events that have no parameters
#define EVENT_NOPARAMS(eventName) \
eventName(const Event::Params*) : Event() { }

struct ExampleEvent : public Event
{
START_EVENTPARAMS()
std::string m_strMsg;
END_EVENTPARAMS(ExampleEvent)

DECLARE_EVENTTYPE("ExampleEvent", 1);
};

我的目的是希望能够从这个派生基于 python 的事件类,但是声明和使用事件参数的机制嵌入在宏中。坦率地说,我认为它在 C++ 中的设置方式无论如何都不会在 python 中工作,因为事件在 python 中具有的任何参数都可能存储在字典中。

是否有使用 boost.python 导出此功能的方法,或者是否有更好的方法来设计可在 C++ 和 Python 中良好运行的通用参数支持类?

最佳答案

最终,Python 没有真正的方法来创建新的 C++ 类型,这实际上就是您要问的。如果您希望能够在 Python 中创建与在 C++ 中创建的事件类型处于同等地位的新事件类型,那么您将需要在 C++ 中使用更动态的、类似于 Python 的结构。

如果您的要求确实是这仅适用于 C++ 和 Python(即您不打算将其扩展到其他语言),那么您可以考虑将事件参数存储在 boost::python::dict 中。而不是作为单独的数据成员。您需要使用 boost::python::extract<>在 C++ 中访问值,但除此之外它是一个非常干净的系统。 (并且您可能可以将提取调用隐藏在模板化访问器方法中。)

另一种选择是使用 getter 访问事件参数,例如Event::get_param<T>("name") .如果将其设为虚拟,则基于 Python 的事件实现可以提供自己的版本。

关于c++ - 如何使用 boost.python 导出复杂类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21560402/

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