如何在0(1)操作中将c ++向量转换为lisp向量

时间:2014-04-25 03:36:19

标签: c++ common-lisp cffi

我在CFFI中包含了C ++ vector<int>的这些C绑定。

我知道如何使用vector<int>创建std_carrayTovector并使用int将数据转换回std_vectorToCArray指针,以便我可以使用Lisp从中检索数据CFFI函数MEM-AREF。我为下面写了正确的defcfun

我的问题是:如何将defcfun的{​​{1}}的输出转换为Lisp向量(例如std_vectorToCArray)并使其成为O(1)操作 - 即全部数据同时复制。

#(1 2 3)

1 个答案:

答案 0 :(得分:0)

我还没试过这个,但我认为以下内容应该有效。关于std::vector我们可以使用的重要一点是,它保证有一个诚实的上帝阵列支持。也就是说,& my_vector [0]指向my_vector对象的数组。 (当然,这不仅适用于std::list或其他任何事情)

所以你要做的就是创建一个CFFI可以调用的函数(在你的C ++代码中),它返回一个指向向量开头的指针。大概是这样的:

extern "C"
Foo*
start_of_foo_vector (std::vector<Foo> vec)
{
    return & vec[0];
}

您需要extern "C",因此您不必担心名称错误。当然,您必须为每种类型编写不同的功能(并且不能使用extern "C"的模板,我不这么认为。

在下次修改向量之前,您获得的指针有效。