c++ - 具有私有(private)/删除的默认构造函数的参数类型

标签 c++ swig

假设我想将 std::type_index 类型映射为 SWIG 中的参数(忽略目标语言中所述类型的完全无意义)。

void dosomething(std::type_index arg);

包装此函数在生成的代码中提供以下 decldef,在从 inarginit 等类型映射方法生成的代码之前:

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/

相关文章:

c++ - 为什么 boost::assign::ptr_map_insert 将构造函数参数调用更改为 const 引用?

c++ - CPLEX - 降低成本

c++ - ICU 与 C++ 中的 Boost 语言环境

c++ - gtkmm 绘制单个像素

c++ - xutility 错误(<chrono> <random> C++ 标准库)

python - python扩展模块中的C++静态成员初始化

perl - 如何将 Perl 数组传递给 SWIG 或从 SWIG 传递出去?

python - 如何提供 SWIG 的包含路径?

java - 如何使用 SWIG 将 C 结构中的 sockaddr_in 映射到 Java

java - 如何使用SWIG包装std::function对象?