我如何通过外部 "C "ABI暴露一个std::vector<std::string>?

问题描述 投票:0回答:1

我正在寻找通过C ABI访问字符串向量的正确方法。我的代码大致是这样的。

#include <iostream>
#include <vector>
#include <cstring>

// A C++ class containing information in a std::vector<std::string> that I want to expose in C (for eventually exporting to python via shared library)

class AVectorOfStrings{
private:
    std::vector<std::string> vec;
public:
    explicit AVectorOfStrings(std::vector<std::string> vec) : vec(std::move(vec)){}

    const vector<std::string> &getVec() const {
        return vec;
    }

    void setVec(const vector<std::string> &vec) {
        AVectorOfStrings::vec = vec;
    }
};

extern "C" {
    // function for accessing the strings
    char** getArrayOfCharStars(AVectorOfStrings* vec){
        std::vector<std::string> strings = vec->getVec();
        char **arr = (char **) malloc(strings.size() * sizeof(char *));

        for (int i = 0; i < strings.size(); i++) {
            arr[i] = (char *) malloc(sizeof(strings[i].c_str()));
            strcpy(arr[i], strings[i].c_str());
        }
        return arr;
    }

}
// usage
int main(){

    std::vector<std::string> input = {"1string", "2string", "3string"};
    AVectorOfStrings vec(input);

    char** arr = getArrayOfCharStars(&vec);

    // A bunch of attempts to access the three strings. 
    std::cout << *arr << std::endl;
    std::cout << *arr[1] << std::endl;
    std::cout << *(arr[1]) << std::endl;
    std::cout << **arr << std::endl;

    return 0;
};

这段代码返回以下结果

1string
2
2
1

获取这些字符串的访问权的正确方法是什么?更一般地说,这是在C++中处理字符串数组的正确方法吗?我的最终目标只是让这些字符串以一种我可以在Python中使用 ctypes.

c++ char c-strings
1个回答
1
投票

看来,如果使用以下方法会简单得多 pybind 并将stl std::vector<std::string> 直接。你有一个例子 此处.

class AVectorOfStrings {
    std::vector<std::string> vec;
};

/* ... binding code ... */

py::class_<AVectorOfStrings>(m, "AVectorOfStrings")
    .def(py::init<>())
    .def_readwrite("contents", &AVectorOfStrings::contents);
© www.soinside.com 2019 - 2024. All rights reserved.