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

标签 c++ boost-python

我有一个事件类,我试图使用 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/

相关文章:

c++ - 标准 :mutex'es as members of objects that will go into containers?

c++ - 在函数中获取原始类型的指针

c++ - 如何通过 Boost::Python 获取调用我的 C++ 函数的 Python 模块和行号?

python - BoostPython 和 CMake

c++ - Boost.Python 和 std::shared_ptr 的多态行为

c++ - GCC 中的 unordered_map 错误

c++ - 如何正确调用对齐的新/删除?

c++ - boost::gil 交错 View

c++ - 传递没有所有权的简单指针来提升 python

c++ - “卸载”Python 模块和 'unbinding' 关联的 API