Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
铸造复合物,非原始C++;将数据类型转换为Erlang/Elixir格式,以便使用NIF导出方法 我正在用C++编写一个库,我将用在IrxIr/Erlang中。存在接受和返回的C++方法,包括通过out参数,以及涉及指针、数据结构或库从 STD< /COD>库,如:元组、向量、优先级队列、比特集等等。以及接受或返回泛型的方法。或者我自己的自定义数据结构_C++_Erlang_Elixir_C++17_Ffi - Fatal编程技术网

铸造复合物,非原始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*

陈述不匹配的其他原因包括:

  • Erlang的整数大小可变
  • Erlang术语被标记(引用的某些位表示类型)
  • 在C/C++中,最接近原子的是枚举,它们是完全不同的
  • 二进制文件(短二进制文件和长二进制文件)和子二进制文件
  • 内存管理 ... 等等

  • 关于方法的方向和所有转换的方法,代码> > 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++?