Swig和C++11的兼容性问题

3

我正在尝试为一个使用C++11的新功能(https://code.google.com/p/cpp-array/)的复杂项目创建一个Python模块。我的接口文件非常简单:

%module array

%{
#include "array-config.hpp"
#include "array.hpp"
%}
%include "array-config.hpp"
%include "array.hpp"

当我运行swig时,出现了很多错误。
第一个错误是关于constexpr的。
constexpr static int dim()
{ return d; }

如果我移除constexpr,我就可以避免这个错误。根据http://www.swig.org/Doc3.0/CPlusPlus11.html中的文档,这个关键字已经被处理。

第二个问题是当找到这个函数时:

template <int d, typename U, typename... Args>
typename std::enable_if<std::is_integral<U>::value and !std::is_pointer<U>::value and d < k, void>::type
init(U i, Args&&... args) {

  assert(i != 0); // Array dimension cannot be zero
  n_[d] = i;
  init<d+1>(args...);
}

我只是想“真正懒惰地”使用swig,但现在我开始怀疑这是否可能。我必须复制整个头文件并开始进行微调才能使其起作用吗?由于我是swig的新手,因此我真的希望得到一些建议。


你能提供实际的错误信息吗? - MikeMB
错误信息不太有用: ~Local/cpp-array/array/array.hpp:450: 错误:输入(3)中的语法错误。 - aaragon
2
在 SWIG 可以封装模板之前,您必须实例化它们。如果您从一个大量使用模板的库开始,这已经需要大量的代码;因此,最好创建一个不使用 constexpr、SFINAE 等的简化接口,并将其提供给 SWIG。 - DanielKO
1个回答

1

您可以随时将 SWIG 不支持的任何内容包装在 #ifdef 中。

例如,我正在使用不受我们使用的 SWIG 版本支持的 C++11 块。因此,我这样做:

namespace glue {
    class GlueServer {
    public:
        virtual void handle(std::string path, GlueHandlerFunc handler, void* arg) = 0;    
#ifndef SWIG
        virtual void handleBlock(std::string path, void (^b)(GlueRequest* req)) = 0;
#endif

// ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接