Вы не можете использовать его напрямую.Вам нужно будет скопировать указатели на каждый внутренний буфер string
в другой vector
.
Предполагая, что arguments_
инициализируется следующим образом:
std::vector<std::string*> arguments_ = {
new std::string("mycmd"),
new std::string("arg1"),
new std::string("arg2")
}
Вы можете позвонить execvp
что-то вроде этого:
// execvp needs a NULL terminator, so make argv one element longer
// than arguments_
std::vector<char*> argv(arguments_.size() + 1);
// copy pointers to each string's buffer into the new vector
std::transform(arguments_.begin(), arguments_.end(), argv.begin(),
[](std::string* arg) {
return arg->data();
});
// The last element of argv was implicitly initialized to a null pointer
// so this isn't actually necessary.
// I just included it to be explicit
argv.back() = nullptr;
// pass a pointer to the array of char*s to execvp
execvp(argv[0], argv.data());
Обратите внимание, что в этом примере используется неконстантная квалифицированная перегрузка std::string::data
, добавленная в C ++ 17.Вместо этого используйте &(*arg)[0]
, если вы используете более старую версию стандарта C ++.