После этого сообщения , где я нашел временное решение для моей другой проблемы , я хочу знать, могу ли я заменить int argc, char** argv
на std::vector<std::string>
переменную / object.
Рассмотрим воображаемый код:
#include <iostream>
#include <CloseLibrary>
void someFunction(int argc, char** argv){
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}
int myFunc(int argc, char** argv){
someFunction(argc, argv);
return 0;
}
, где CloseLibrary
- закрытая библиотека, к которой у меня нет доступа к исходному коду, а функция someFunction
из эта библиотека требует аргументов командной строки int argc, char** argv
. Но по по какой-то причине У меня не может быть двойных указателей char**
в моем коде.
Здесь, в этом посте предлагается нечто вроде того, что мне нужно, но я не знаю, как это использовать. Можно ли написать код следующим образом:
#include <iostream>
#include <CloseLibrary>
#include <vector>
void someFunction(int argc, char** argv){
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}
int myFunc("args", [](std::vector<std::string> args){
std::vector<char *> cstrs;
cstrs.reserve(args.size());
for (auto &s : args) cstrs.push_back(const_cast<char *>(s.c_str()));
someFunction(cstrs.size(), cstrs.data());
return 0;
}
Или, может быть, есть более канонический способ сделать это? Буду признателен, если вы поможете мне найти правильный способ сделать это и понять решение. Заранее благодарим за помощь.
PS1. Метод char* argv[]
подходит для тела функции, но не подходит для входных данных. Я не знаю, почему Pybind11 делает это!
PS2. Здесь, на pybind11 gitter , было предложено:
void run(const std::vector<std::string>& args) {
for(auto&& e : args) std::cout << e << '\n';
}
PS3. Также предлагается на pybind11 Гиттер:
char** argv = new char*[vec.size()]; // just like malloc(sizeof(char*)*vec.size());
for (int i = 0; i < vec.size(), i++) {
argv[i] = new char[vec[i].size()];
memcpy(argv[i], vec[i].data(), vec[i].size()); // or strcpy
}