我来自Swift背景,虽然我也懂一些C,但这是我第一次写C++代码。
在Swift中,可以编写一个接受任意数量参数的函数:
func foo(bar: String...) {
// ...
}
并且bar
可以是任何类型(字符串、布尔、结构、枚举等)。
我想知道在C++中是否也可以这样做。所以,理想情况下我会写:
struct X {
string s;
X(int);
// ...
}
void foo(string s, ...) {
// ...
}
foo("mystr", X(1), X(2), X(3));
在foo
中,我可以访问参数列表,有点类似于printf
函数。
现在我使用vector<X>
作为参数,因为所有的参数都是X类型。然而,在我看来,这使得调用foo
有点难看:
foo("mystr", { X(1), X(2), X(3) });
由于我对C++知识的严重缺乏,我看不到任何解决方案吗?
**编辑:**这是我特别希望在foo
中完成的工作:
string ssub(string s, vector<X> v) {
int index, i = 0;
while (1) {
index = (int)s.find(SUB);
if (index == string::npos) { break; }
s.erase(index, string(SUB).size());
s.insert(index, v[i].tostr());
i++;
}
return s;
}
基本上,只要给我一种顺序访问参数的方法,一切都是好的。
3条答案
按热度按时间rta7y2nd1#
这是众多方法中的一种。
您可以将整个程序复制/粘贴到IDE/编辑器中。
示例输出:
vjhs03f72#
您可以使用variadic templates(C++11起):
变量模板示例:
min
函数这是我编写的代码,用于在计算多个值的最小值时消除对
std::min
的丑陋调用。这是棘手的部分:不能像
vector
s那样循环参数包,必须执行一些递归操作,如示例所示。o4tp2gmn3#
你可以写一个变量模板函数,把参数传递给
std::initializer_list
,然后遍历列表,例如:还要注意,你可能想要改变参数列表和初始化列表的类型以满足你的实际用例。例如,使用
Args * ... args
和std::initializer_list<X *>
或类似的。