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

C++ 如何使用boost.python导出复杂类,c++,boost-python,C++,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 { }; Even

我试图使用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);
};
类事件
{
私人:
未签名的\uuu int64 m\u时间戳;
公众:
//用作事件参数基础的空参数结构
//在派生类中。
结构参数{};
事件();
虚拟无符号整数类型()常量=0;
虚拟常量char*TypeName()常量=0;
无符号uu int64 TimeStamp()常量{return m_TimeStamp;}
};
typedef共享事件ptr;
#定义DECLARE_EVENTTYPE(typeName,id)\
枚举{TYPE=id}\
无符号int Type()常量{return static_cast(id);}\
const char*TypeName()const{return TypeName;}
//用于声明事件参数结构开始的宏
#定义START_EVENTPARAMS()结构参数:public Event::Params{
//用于完成事件参数结构声明的宏
#定义END_事件参数(eventName)\
}m_Params\
eventName(const Event::Params*pkParams=NULL):事件()\
{                                                                       \
if(NULL!=pkParams)\
{                                                                     \
const eventName::Params*pkEventParams=\
重新解释铸造(pkParams)\
if(NULL!=pkEventParams)\
m_Params=*pkEventParams\
}                                                                     \
}                                                                       \
静态常量eventName::参数和参数(常量EventPtr pkEvent)\
{                                                                       \
常量共享\ptr pkErrorEvent(\
动态指针转换(pkEvent)\
返回pkErrorEvent->m_参数\
}
//用于无参数事件的宏
#定义事件参数(eventName)\
eventName(const Event::Params*):Event(){}
结构示例事件:公共事件
{
启动事件参数()
std::字符串m_strMsg;
结束事件参数(ExampleEvent)
声明事件类型(“ExampleEvent”,1);
};
其目的是我希望能够从这个类派生出基于python的事件类,但是声明和使用事件参数的机制嵌入在宏中。坦率地说,我认为C++中的设置方式无论如何都不会在Python中工作,因为Python中的任何参数都可能存储在字典中。

有没有一种方法可以使用BooSt.python导出这个功能,或者有更好的方法来设计泛型参数支持类,它将在C++和Python中工作得很好?

< p>最后,没有真正的方法来创建Python C++,它本质上是你所要求的。如果你想在Python中创建与C++中可以创建的事物相适应的新事件类型,那么你需要在C++中使用一个更动态的、Python的结构。p>

如果您的需求真的是只在C++和Python中工作(即,您不打算将此扩展到其他语言),那么您可以考虑将事件参数存储在Boo::Python::DICT< /C>中,而不是作为单独的数据成员。您需要使用<代码> Boo::Python::C++中的“提取< /代码>”来访问这些值,但否则它是一个非常干净的系统。(您可能可以将提取调用隐藏在模板化的访问器方法中。)

另一个选项是使用getter访问事件参数,例如
event::get_param(“name”)
。如果将此虚拟化,则基于Python的事件实现可以提供自己的版本