将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
Casting complex, non-primitive C++ data types into Erlang/Elixir format, to export methods using NIF
我正在用C++编写一个库,我将在Elixir/Erlang中使用。有C++接受和返回的方法,包括通过 out 参数,并涉及指针、数据结构或库中std
库,例如:元组、向量、优先级队列、位集等。以及接受或返回泛型的方法。或者我自己的自定义数据结构。
如何导出此类方法?
template<class T1>
std::array<MyStruc1, 24> my_func(
const T1& a1,
int b1,
int c1,
unordered_map<MyStruc1, double>& d1,
unordered_map<MyStruc2, int>* e1=nullptr) {
///////
}
我熟悉并找到了转换简单结构的示例:char*、简单结构和仅基元类型。
在 Erlang 中,类型是这里定义的内容。内部 Erlang 和 C/C++ std 表示形式不匹配,例如,您不能从 C 返回int64_t
并直接从 Erlang 使用它。
复杂结构也一样,PrioryQueue
是 Erlanglist()
还是{list(), pos_integer()}
?
这意味着您需要使用enif_get_*
和enif_make_*
erl_nif 函数来回转换类型。对于非常复杂的结构,这可能很乏味,因此您确实需要考虑使用资源对象是否还不够。
资源对象只是指向内存的指针,因此对于 Erlang 来说是不透明的。您可以让此不透明保留指向优先级队列内存的指针,并包括将 Erlang 术语put/2
和get/2
队列的方法。为什么需要erl_nif的功能?
Erlang 具有动态类型,其中变量持有的每个引用都包含其类型(在直接术语的值中,或在引用术语的引用中(,而 C/C++ 具有静态类型,其中变量是仅在编译时声明类型的变量。
对于 C/C++,0xfabada
可以是int
、uint
、char*
、指向自定义结构的void*
......
陈述不匹配的其他原因包括:
- Erlang 的整数具有可变大小
- Erlang 术语被标记(引用的某些位指示类型(
- C/C++中最接近原子的是枚举,它们完全不同 二进制
- 文件(短二进制文件和长二进制文件(和子二进制文件
- 内存管理 ...等等。
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 将RGB图像保存为PPM格式
- 如何在Elixir中调用递归函数并行
- 询问在设计我的手臂模拟器功能表示格式1
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 如何将strftime中的格式错误作为异常捕获
- 将CHW格式的浮点向量转换为cv::Mat
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 如何以叮当格式设置评论的行长?
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法