如何包装可变模板类的可变模板成员函数?
2019-8-14 10:52:44
收藏:0
阅读:77
评论:2
我有一个包含可变模板定义的头文件,该头文件还包含一些可变模板成员函数。为了简洁起见,以下代码片段已经显著简化和裁剪:
#pragma once
template<typename T, typename ... CtorArgs>
class Foo {
public:
Foo(CtorArgs... args) : _m(args...) {}
template<typename ... Args>
void DoSomething(Args... args) { _m.DoSomething(args...); }
private:
T _m;
};
然后,我有另一个定义用于模板特化的类头文件:
#pragma once
#include <string>
#include <iostream>
class Bar {
public:
Bar(std::string const & a,
std::string const & b) :
m_strA(a),
m_strB(b) {}
void DoSomething(int const one, int const two) {
std::cout << "Str A: " << m_strA << ", Str B: "<< m_strB << ", ints: " << one << ", " << two << std::endl;
}
private:
std::string m_strA;
std::string m_strB;
};
我想使用SWIG包装Foo特化,以及它的模板成员函数,以便我可以从Lua脚本中使用它们。
我遇到的问题是,SWIG未按照我预期生成DoSomething模板函数的包装器。
阅读一些SWIG文档后,我知道它无法使用多个替换参数包的**%template指令,因此我使用了%rename**代替:
%module FooSwig
%include <std_string.i>
%{
#include "foo.hpp"
#include "bar.hpp"
%}
%include "foo.hpp"
%include "bar.hpp"
%rename(lua_foo) Foo<Bar, std::string const &, std::string const &>;
class Foo<Bar, std::string const &, std::string const &> {
public:
Foo(std::string const &, std::string const &);
template<typename ... Args>
void DoSomething(Args... args);
private:
Bar _m;
};
使用**%template**指令不起作用(预期),因为有多个参数要替换-我从swig中得到以下内容:
Error: Template 'DoSomething' undefined.
我想我需要再次使用**%rename**解决这个问题,但我想不出如何做到这一点。我尝试了以下内容:
%extend Foo<Bar, std::string const &, std::string const &>
{
%rename(Do_Something) DoSomething<int const, int const>;
void DoSomething(int const, int const);
}
那确实生成了一些东西,但包装器包含一个未定义函数的符号:
Foo_Sl_Bar_Sc_std_string_SS_const_SA__Sc_std_string_SS_const_SA__Sg__DoSomething(arg1,arg2,arg3);
而不是预期的成员函数模板的调用,大致如下
(arg1)->SWIGTEMPLATEDISAMBIGUATOR DoSomething<int const, int const>(arg2, arg3);
我要尝试的事情越来越少,也许你们中的一个可以帮忙?
一些关于我的环境的信息: 我正在使用g++ 7.4.0,c++ 17和SWIG 3.0。
点赞
用户7398118
最好的解决方案是编写多个模板类,每个类针对不同数量的模板参数,因为通常模板参数并不多。
2021-05-10 17:27:06
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我已经成功生成了包装器,它的工作符合预期。
这是老的 SWIG 接口文件代码片段:
... template<typename ... Args> void DoSomething(Args... args); ...我用以下代码取代了它:
... void DoSomething(int const, int const); ...不过我仍然好奇是否有更好的方法来做到这一点,如果有更多的信息(或阅读材料/源代码的指针),欢迎分享。