我们正在使用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/