3

我正在将 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

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

谢谢。

4

4 回答 4

1

你有没有想过让你的函数使用一对迭代器而不是一个容器?您必须将其设为模板函数,所以我可以理解为什么它可能无法像您希望的那样工作,但它会让您传入数组。

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

handler(argv, &argv[argc]);

它仍然不是一个完美的解决方案,但它会更通用,并允许您使用预先存在的数组。

于 2012-09-06T16:39:31.637 回答
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

于 2012-09-06T16:41:21.803 回答
0

好吧,我确定您是否了解 ::vector,您是否研究过 ::array?

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

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

注意:我不确切知道 std::array 是如何布局的,很明显这很难实现:/

于 2012-09-06T16:24:55.820 回答
0

这些指针元素将引用什么类型的数据?

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

这些项目是相同类型还是相同大小?

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

所有这些主题都可以用来决定使用哪个库、是否面向对象以及使用哪个数据结构或集合。

似乎 std 和 Boost 应该是首先查找的首选。但是,有时,您可能必须建立自己的收藏。

你的库似乎需要一个可索引的列表概念而不是一个数组,但有时是可以互换的。

干杯。

于 2012-09-06T16:45:10.027 回答