[英]How to export complex class with boost.python
我有一個事件類,我試圖使用Boost.Python在python中訪問。 這是列表,以及相關的宏和示例派生事件類。
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
而不是作為單獨的數據成員。 您需要在C ++中使用boost::python::extract<>
來訪問值,否則它是一個非常干凈的系統。 (並且您可以在模板化的訪問器方法中隱藏提取調用。)
另一種選擇是使用getter訪問事件參數,例如Event::get_param<T>("name")
。 如果你使這個虛擬化,那么基於Python的事件實現可以提供自己的版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.