C ++包装器,用于从C函数返回的指针数组

时间:2012-09-06 16:19:52

标签: c++ stl

我正在向C库添加C ++前端。该库中的一个函数调用一个带有数组的处理程序和一个具有数组大小的整数。因此,您必须提供C函数,

int handler(int argc, sometype **argv);

现在,我想允许C ++调用代码提供更多C ++ ish处理函数,比如,

int handler(std::vector<sometype*> args);

更改处理程序类型并不难,我只需提供自己的handler,然后调用用户提供的处理程序。所以我需要创建一个std::vector并将argv的内容复制到其中。

但是,如果可能的话,我真的不想复制整个指针列表。不幸的是,我认为不可能告诉std::vector为其内部数组使用已经分配的内存块,而且该数组是静态的,应该被视为const

是否有一些类似于std::vector的STL类型可以用来包装预先分配的C风格的数组,并且界面更友好?它应该支持大小查询和迭代,类似于std::vector

感谢。

4 个答案:

答案 0 :(得分:1)

您是否考虑过让您的函数使用一对迭代器而不是容器?你必须使它成为一个模板函数,所以我可以理解为什么它可能不会像你想的那样工作,但它会让你传入数组。

template<typename I>
int handler(I begin, I end);

handler(argv, &argv[argc]);

它仍然不是一个完美的解决方案,但它更具通用性,允许您使用预先存在的阵列。

答案 1 :(得分:1)

我不确定你在问什么,但如果给我这个函数原型

int handler(int argc, const sometype *const *argv);

这是一个C ++包装器:

int handler(const std::vector<sometype*>& arg) 
{return handler(arg.size(), &arg[0]);} //no copies

template<class const_iterator>
int handler(const_iterator begin, const_iterator end) //can pass any structure
{return handler(std::distance(begin, end), &*begin);} //no copies

以下是我在C ++中实现此API的方法:

int handler(int argc, const sometype *const*argv) {
    const std::vector<const sometype*> arg(argv, argv+argc); //this will copy the pointers
    //stuff
}

不幸的是,没有办法将现有数组放入向量中,但是复制一些指针真的很慢而不关心?

汇编证明:http://ideone.com/BkSVd

答案 2 :(得分:0)

好吧,我确定你是否知道:: vector,你已经研究过:: array?

http://www.cplusplus.com/reference/stl/array/

然而,主要问题 - 将对象覆盖到现有内存上 - 让我想起了简单的数据包嗅探器:创建对象结构,然后通过在已知数据上移动其引用来覆盖它。我不确定你是否可以在你的问题中做到这一点,但这是我考虑的第一条途径。

注意:我不确切地知道std :: array是如何布局的,因此很难实现:/

答案 3 :(得分:0)

这些指针元素将引用哪种类型的数据?

谁是这些指针元素的所有者,我的意思是,那些元素刚刚被集合/数据结构引用,还是那个负责分配,解除分配这些项目的集合?

这些项目的类型是相同还是相同?

例如,不同大小的字符数组,或者可能是不同基类的对象,但是来自共同的祖先。

可以考虑所有这些主题来决定使用哪种库,面向对象,以及使用哪种数据结构或集合。

似乎std和Boost应该是第一个先查找的选项。但是,有时候,您可能需要构建自己的集合。

你的库似乎需要更像是一个可索引的List概念而不是一个数组,altought,有时是可互换的。

干杯。