铸造复合物,非原始C++;将数据类型转换为Erlang/Elixir格式,以便使用NIF导出方法 我正在用C++编写一个库,我将用在IrxIr/Erlang中。存在接受和返回的C++方法,包括通过out参数,以及涉及指针、数据结构或库从 STD< /COD>库,如:元组、向量、优先级队列、比特集等等。以及接受或返回泛型的方法。或者我自己的自定义数据结构
如何导出这些方法铸造复合物,非原始C++;将数据类型转换为Erlang/Elixir格式,以便使用NIF导出方法 我正在用C++编写一个库,我将用在IrxIr/Erlang中。存在接受和返回的C++方法,包括通过out参数,以及涉及指针、数据结构或库从 STD< /COD>库,如:元组、向量、优先级队列、比特集等等。以及接受或返回泛型的方法。或者我自己的自定义数据结构,c++,erlang,elixir,c++17,ffi,C++,Erlang,Elixir,C++17,Ffi,如何导出这些方法 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) { /////// } 模板
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) {
///////
}
模板
std::数组我的函数(
常数T1和a1,
int b1,
int c1,
无序地图和d1,
无序_映射*e1=nullptr){
///////
}
我熟悉并找到了转换简单结构的示例:char*、简单结构和基本类型。在Erlang中,类型是在中定义的。内部Erlang和C/C++std表示不匹配,您不能从C返回一个,例如,
int64_t
,然后直接从Erlang使用它
对于复杂结构,是PrioryQueue
Erlang的list()
还是{list(),pos_integer()}
这意味着您需要使用enif\u get.*
和enif\u make.*
函数来回转换类型。对于真正复杂的结构,这可能是乏味的,所以你真的需要考虑它是否还不够用。
资源对象只是指向内存的指针,因此对于Erlang来说是不透明的。您可以让这个不透明的对象保持指向优先级队列内存的指针,并包含将/2和获取/2
Erlang术语放入队列的方法
为什么需要来自的功能?
Erlang具有动态类型,其中变量持有的每个引用都包含其类型(直接项的值或引用项的引用中),而C/C++具有静态类型,其中变量仅在编译时声明类型
对于C/C++,0xfabada
可以是指向自定义结构的int
、uint
、char*
、void*
陈述不匹配的其他原因包括:
关于方法的方向和所有转换的方法,代码> > NIFY**/COS> > >是将类型从C++转换为Erlang或从Erlang转换为C++?@帕维尔,你有两个方向。使用
enif_make.*
可以从C/C++类型创建Erlang术语,使用enif_get.*
可以从Erlang术语中提取C/C++函数包装的点和方向,例如ERL_NIF_术语my_NIF_cpp_func(ernifev*env,int argc,const ERL_NIF__术语argv[]){…}<代码> >从C++到Erlang或从Erlang到C++。NIFS被从Erlang代码调用并由C代码处理,如果你想换个方法,你需要创建一个驱动程序而不是NIFS。我理解,因为您正在开发一个库,所以您想要的行为就是nifs提供的行为。您可以检查或举例说明函数包装器的点和方向,例如<代码> ErLyNIFFILY MynIFIFCCPUFUNC(ErnIFIFN**EV,INTARARC,const ErLyNIFYONESTARG[]){{}} /Calp> > >从C++到Erlang或从Erlang到C++?