如何在C++中的函数中包含可变数量的参数.
C#中的模拟:
public void Foo(params int[] a) {
for (int i = 0; i < a.Length; i++)
Console.WriteLine(a[i]);
}
public void UseFoo() {
Foo();
Foo(1);
Foo(1, 2);
}
Run Code Online (Sandbox Code Playgroud)
Java中的模拟:
public void Foo(int... a) {
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
public void UseFoo() {
Foo();
Foo(1);
Foo(2);
}
Run Code Online (Sandbox Code Playgroud) 我喜欢在列表上编写函数检查.为此我通常写一个这样的函数:
inline bool good_strings(const std::vector<const char *> & items)
{
for (i in items) {
if (not is_good(i)) return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
然后我可以写得像if (all_good({"a", "b", "c", "d", "e"})) {...},它看起来非常好.当您对几件物品的检查变得更大时,这很好用:
if (is_good("a") and is_good("b") and /* that's too much, man */ is_good("c")) {...}
Run Code Online (Sandbox Code Playgroud)
但我关心的是我使用的容器的开销,也很难选择一个:std::vector,std::list,QList,QStringList或者甚至std::array或std::initializer_list- 应该使用内联函数?在使用括号创建时,这些中的哪一个具有最小甚至零开销{}?
好的,并且更新:我抓住了我的朋友许可的IDA Pro并检查了一些选项.
std::initializer_list:该函数甚至没有内联,并且存在创建列表和复制指针的开销.std::vector:函数内联,但是,创建向量和复制指针存在开销.std::array:由于模板特化而不是很好看,而且函数没有内联.因此,多次调用会创建许多类似的代码块.但是,没有数组创建的开销,并且所有指针都作为函数参数传递,这对于x86_64寄存器调用约定来说很快.问题仍然存在,是否有一个绝对零成本的容器?
我有一个可变参数模板函数foo():
template <typename... Args>
void foo(Args &&... args);
Run Code Online (Sandbox Code Playgroud)
此函数旨在使用的所有参数调用size_t.我可以使用一些元编程来强制执行.我需要一次获取两个参数的结果列表,并将它们放入容器中std::pair<size_t, size_t>.从概念上讲,类似于:
std::vector<std::pair<size_t, size_t> > = {
std::make_pair(args[0], args[1]),
std::make_pair(args[2], args[3]), ...
};
Run Code Online (Sandbox Code Playgroud)
有一种直截了当的方法吗?我知道通过包扩展,我可以将参数放入一个扁平的容器中,但是有没有办法将它们两个一起分组到std::pair对象中?