假设我想将 std::type_index
类型映射为 SWIG 中的参数(忽略目标语言中所述类型的完全无意义)。
void dosomething(std::type_index arg);
包装此函数在生成的代码中提供以下 decldef,在从 in
和 arginit
等类型映射方法生成的代码之前:
std::type_index arg1;
std::type_index
没有默认构造函数。我无权访问它的定义。 C++ 编译器毫不客气地拒绝了代码。
如何让 SWIG 生成可用代码?
我查看了不同的类型映射方法,但一无所获;特别是,typemap(arginit)
看起来很有希望,但是当它没有替换 arg1
的 decldef 时就失败了。
更新:将函数签名更改为...
void dosomething(const std::type_index& arg);
... 强制 SWIG 生成 std::type_index*
作为 arg1
的类型。不过,我同样感到困惑,因为我无法让它与按值传递一起使用。我原来的问题是(在四重否定池中)。
编辑:
根据请求,使用由 SWIG 将 Python 字符串按值类型映射到 std::type_index
的 Python 调用函数的方式如下:
dosomething("ClassName")
最佳答案
使用 %nodefaultctor
特性:
%nodefaultctor std::type_index; // Disable default constructor generation for that class
因为 std::type_index
没有定义默认构造函数,所以这应该可以工作。看起来您必须在 .i 文件中定义类之前放置语句,所以在 %include
语句之前放置 type_index
。
SWIG 文档第 6.6.2 节中的详细信息(例如 http://www.swig.org/Doc3.0/SWIGPlus.html#SWIGPlus_nn8 如果您使用的是 SWIG 3——但此功能自 1.3 以来没有太大变化)。
更新:如果您的目标是将函数调用为 dosomething("ClassName")
,那么我会考虑使用 %inline
创建一个 dosomething (std::string)
然后调用 type_index
版本。在您的 .i 文件中,它看起来像这样:
%include "std_string.i"
%{
%include "dosomething.h"
%}
%inline %{
void dosomething(std::string arg)
{
... determine which type index to use ...
dosomething(type_index(whatever))
}
%}
关于c++ - 具有私有(private)/删除的默认构造函数的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24856286/