痛饮 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)

示例现已完成