【发布时间】:2018-10-25 11:37:16
【问题描述】:
我想编写一个接受可变数量的字符串文字的函数。如果我用 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"});。
【问题讨论】:
-
您是否与调用语法
foo("hello", "world");绑定在一起?如果不是,那么std::initializer_list<const char *>是合适的参数类型 -
@gsamaras 我想要的语法根本不起作用。如果
T args...的意思是“std::initializer_list<T>已从所有剩余参数初始化,则否。 -
@Caleth - 我已经更新了问题:我想避免 ({})(但感谢您澄清我的要求)
-
回复:“担心 [它] 会让错误变得混乱”——试试吧。
标签: c++ c++11 templates variadic-templates c++17