使用SWIG包装返回std::tuple的类成员函数遇类型不匹配错误
解决SWIG包装条件编译的keywordValue_t(variant/tuple)类型不匹配问题
让SWIG对齐编译分支
调用SWIG时直接传递对应C标准的参数,比如启用C17就加-std=c++17;如果是用自定义宏控制variant/tuple分支,要在SWIG调用时通过-DXXX传递相同宏,保证SWIG预处理代码时和实际编译项目用的是同一个分支,避免生成的包装代码用了tuple适配,实际却编译variant的情况。分别适配variant和tuple的SWIG代码
在SWIG接口文件(.i)里用条件编译分别导入对应标准库的适配模块:%{ #if __cplusplus >= 201703L #include <variant> #else #include <tuple> #endif %} #if __cplusplus >= 201703L %include <std_variant.i> %template(KeyVariant) std::variant<int, double, std::string>; // 替换成你实际的variant类型列表 typedef std::variant<int, double, std::string> keywordValue_t; #else %include <std_tuple.i> %template(KeyTuple) std::tuple<int, double, std::string>; // 替换成你实际的tuple类型列表 typedef std::tuple<int, double, std::string> keywordValue_t; #endif这样SWIG会根据C++版本生成对应类型的包装代码,不会出现SwigValueWrapper和实际返回类型不匹配的问题。
检查SWIG版本
旧版SWIG对C++17 variant支持较差,直接升级到SWIG 4.0及以上版本,能更好处理variant的包装;如果没法升级,就强制项目用tuple分支,避开variant的适配问题。手动修正返回值包装
如果上面的方法还不行,就在接口文件里用%extend重新声明readKeyword函数,让SWIG重新推导返回类型:%extend CArcFitsFile { keywordValue_t readKeyword(const std::string& key) { return $self->readKeyword(key); } }
内容的提问来源于stack exchange,提问作者GMacD
相关产品推荐
相关产品推荐

