痛饮 std::map<std::string, T>
Swig std::map<std::string, T>
我正在尝试将 C++ std::map 转换为 C#。
我知道有一种方法可以使用 std_map.i 来做到这一点,但它似乎只有在我为每个 class 编写一个像
这样的新模板时才有效
%template(String_Foo_Map) std::map<std::string, Foo>;
%template(String_Bar_Map) std::map<std::string, Bar>;
...
有没有办法无论使用什么类型都自动做到这一点?像
%template(String_T_Map) std::map<std::string, T>;
它会创造
String_Foo_Map
String_Bar_Map
...
您可以像为 Numpy 一样为 SWIG 定义宏
头文件
#include <map>
#include <string>
class A {
public:
A() : m_a(1.0f) {}
float m_a;
};
class B {
public:
B() : m_b(2.0f) {}
float m_b;
};
SWIG 接口文件
%module test
%{
#include "test.h"
%}
%include "std_map.i"
%include "std_string.i"
%include "test.h"
%define %my_templates(DATA_TYPE)
%template(String_ ## DATA_TYPE ## Map) std::map<std::string, DATA_TYPE>;
%enddef
%my_templates(A)
%my_templates(B)
示例现已完成
我正在尝试将 C++ std::map 转换为 C#。 我知道有一种方法可以使用 std_map.i 来做到这一点,但它似乎只有在我为每个 class 编写一个像
这样的新模板时才有效%template(String_Foo_Map) std::map<std::string, Foo>;
%template(String_Bar_Map) std::map<std::string, Bar>;
...
有没有办法无论使用什么类型都自动做到这一点?像
%template(String_T_Map) std::map<std::string, T>;
它会创造
String_Foo_Map
String_Bar_Map
...
您可以像为 Numpy 一样为 SWIG 定义宏
头文件
#include <map>
#include <string>
class A {
public:
A() : m_a(1.0f) {}
float m_a;
};
class B {
public:
B() : m_b(2.0f) {}
float m_b;
};
SWIG 接口文件
%module test
%{
#include "test.h"
%}
%include "std_map.i"
%include "std_string.i"
%include "test.h"
%define %my_templates(DATA_TYPE)
%template(String_ ## DATA_TYPE ## Map) std::map<std::string, DATA_TYPE>;
%enddef
%my_templates(A)
%my_templates(B)
示例现已完成