我们正在使用stl容器迁移到现代c++中。但是旧的c语言仍然保持着类的风格。重构最困难的领域之一是C api的接口。

// foo_types_list (array terminated by FOO_TYPE_NONE)
enum FooTypes find_best_footype(const enum FooTypes *foo_types_list,
                                        unsigned int capabilities);

std::vector<FooTypes> myFooTypes{ FOO_TYPE_A, FOO_TYPE_ZZ, FOO_TYPE_B };

FooTypes foo = find_best_footype( &myFooTypes.front(), 42); // fail, not terminated.

适应这些c-api的最佳策略是什么?我需要终止载体来进行调用,但我不想创建不必要的突变或拷贝?
如果创建副本是唯一的方法,那么创建一个与C函数中的访问器兼容的数据结构的简单方法是什么?

最佳答案

一个更好的解决方案是将find_best_footype的接口更改为获取指针和长度,而不是假设使用终结符。
(如果必须为find_best_footype保持C兼容性)
然后你可以写:

FooTypes foo = find_best_footype(myFooTypes.data(), myFooTypes.size(), 42);

不需要改变向量。然而,这将需要其他地方的改变。

关于c++ - 将STL容器传递给C函数的准则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41596689/

10-11 20:18