#c
#c
Вопрос:
Итак, я хочу передать массив std::strings в функцию. Количество std::strings в массиве предопределено с помощью preproc. directives. Все это должно выглядеть следующим образом:
#define ARRAYSIZE 3
void foo(std::string[ARRAYSIZE]);
void foo(std::string instrings[ARRAYSIZE])
{
...
}
Вопрос: Могу ли я вызвать функцию без необходимости сначала сохранять массив std::string в переменную, а затем вызывать с ее помощью? Итак, в основном я хочу вызвать его с помощью одной строки, например:
void main()
{
...
foo( std::string x[ARRAYSIZE] = {"abc","def","ghi"} );
...
}
Проблема в том, что я не могу определить правильный синтаксис вызова функции (я даже не уверен, что он существует), visual studio intellisense продолжает отбрасывать мои идеи.
Комментарии:
1. Использование
std::array
иstd::vector
полезно для души.2.
#define
для констант совершенно не нужно. Вместо этого используйтеconst
orconstexpr
.3. @chris Я бы сказал, что это зависит от области видимости. Если я должен использовать одинаковую длину массива для нескольких несвязанных функций, и длина должна быть точно такой же, я бы использовал define . Но опять же, это не совсем лучшая практика, и это с точки зрения C … в конце концов, это действительно не имеет значения.
4. @rath, вы можете использовать глобальную константу, если вам действительно нужно. По крайней мере, на самом деле это объект, который подчиняется правилам определения области видимости, а не просто заменяемый текст.
5. @chris 1, аргумент замены текста имеет смысл.
Ответ №1:
Если вы хотели бы переключиться на std::vector
который может быть создан «на лету», как вы упомянули в комментарии к вопросу, это должно сработать (работает с gcc):
void foo(const std::vector<std::string> amp;stringVec)
{
}
int main()
{
foo( std::vector<std::string>({"abc","def","ghi"}));
}
Комментарии:
1. Спасибо, это работает! 🙂 Мне пришлось переписать foo, чтобы он ожидал вектор, что означает, что компилятор больше не проверяет размер массива, он принимает любой вектор строк, но я могу просто проверить это сам и выдать какое-нибудь ужасное сообщение об ошибке, если размер не равен ARRAYSIZE
Ответ №2:
Одним из способов передачи нескольких значений, подобных этому {x0,x1,x2,…}, было бы использование std::initializer_list, который был введен в c 11. Хотя таким образом невозможно принудительно ввести постоянное количество значений.
void foo(const std::initializer_list<std::string>amp; input) {
}
int main() {
foo({"abc","def","ghi"});
}