Я хочу написать функцию, которая принимает переменное число строковых литералов. Если бы я писал на C, мне пришлось бы написать что-то вроде:
void foo(const char *first, ...);
и тогда вызов будет выглядеть так:
foo( "hello", "world", (const char*)NULL );
Похоже, в C++ должно быть возможно сделать лучше. Лучшее, что я придумал, это:
template <typename... Args>
void foo(const char* first, Args... args) {
foo(first);
foo(args);
}
void foo(const char* first) { /* Do actual work */ }
Вызывается как:
foo("hello", "world");
Но я боюсь, что рекурсивный характер и тот факт, что мы не проводим никаких проверок типов до тех пор, пока мы не дойдем до одного аргумента, будет запутывать ошибки, если кто-то называет foo("bad", "argument", "next", 42)
. То, что я хочу написать, это что-то вроде:
void foo(const char* args...) {
for (const char* arg : args) {
// Real work
}
}
Какие-либо предложения?
Изменение: существует также опция void fn(std::initializer_list<const char *> args)
, но это делает вызов foo({"hello", "world"});
которого я хочу избежать.