在 class 中包含一个枚举,而不包含 SWIG 中的

Include an enum from within a class, without including the in SWIG

我必须与 SWIG 映射的一些接口正在使用来自 类 我其他库的接口。 例如,我有一个 const boost::asio::ssl::context::file_format 类型的参数,它指的是一个定义为:

的枚举
// ssl/context_base.hpp
// ~~~~~~~~~~~~~~~~~~~~  
// [...]

namespace boost {
namespace asio {
namespace ssl {

class context_base
{
public:
  // [...]

  /// File format types.
  enum file_format
  {
    /// ASN.1 file.
    asn1,

    /// PEM file.
    pem
  };
};

} } }

如果我 %include <boost/asio/ssl.hpp> 那么将生成所有方法并给我很多不同的错误。

如果我只是将上面的整个定义复制到 .i 文件并且(在这种情况下)boost 确实扩展了枚举,我将不得不记住相应地更改接口文件。

我希望能够只包含来自 boost 头文件的枚举,但我找不到这样做的方法。只有忽略 methods/classes 的函数,但是 none 到 select 它们。

有什么办法可以得到根据头文件生成的enum吗?

使用预处理器:

#ifndef SWIG
//what you don't want in swig
#endif

最后我确实找到了一个解决方案,它使用 %rename 来忽略 class 除了枚举和枚举项之外的所有成员。

%rename("$ignore", "not" %$isenum, "not" %$isenumitem, regextarget=1, fullname=1) "^boost::asio::ssl::context_base::"; 
%include <boost/asio/ssl/context_base.hpp>

这并不完美,因为它会忽略所有以 boost::asio::ssl::context_base:: 开头的内容。但它确实解决了我的问题。