【发布时间】:2016-12-02 14:43:49
【问题描述】:
我有一个复杂的 c++ 库,我需要将其公开给 java android 应用程序。此 C++ 库由标准 C++ 类和 C++ 类模板组成。
库中的一个模板有一个模板构造函数。
因为一个例子胜过千言万语:
namespace NS1 {
template < class T >
class Bar {
protected:
T mVal;
public:
template< class OtherType >
Bar (const Bar<OtherType>& pOther) {
mVal = pOther.mVal;
}
};
class A {
};
class B : public A {};
}
我使用以下 swig 接口文件 sn-p 包装这些:
%extend NS1::Bar< A > {
%template(Abar) NS1::Bar::Bar<NS1::A>;
%template(ABar) NS1::Bar::Bar<NS1::B>;
};
%template(ABar) NS1::Bar< NS1::A >;
%extend NS1::Bar<B> {
%template(BBar) NS1::Bar::Bar<NS1::B>;
};
%template(BBar) NS1::Bar<NS1::B>;
我希望包装器包含模板构造函数的包装:
public class ABar {
public ABar (ABar other) {...}
public ABar (BBar other) {...}
}
没关系,问题是扩展指令似乎忽略了模板参数,并使用这些扩展了 Bar 模板的每个实例化。 IE。 BBar java 类如下所示:
public class BBar {
public BBar (ABar other) {...}
public BBar (BBar other) {...}
}
在这种情况下这是不正确的。
如何将扩展“绑定”到特定的模板实例化?
注意:
在 %extend 指令 (%extend NS1::Bar<NS1::A>{...}) 中使用命名空间会导致 Swig 中的断言失败。
我已经尝试过 swig 2.0.12 和 3.0.8
有什么线索吗?
【问题讨论】: