【发布时间】:2013-01-13 13:19:09
【问题描述】:
一段代码值一千字:
int main()
{
// All of the following calls return true:
AreEqual(1, 1);
AreEqual(1, 1, 1);
AreEqual(1, 1, 1, 1);
AreEqual(1, 1, 1, 1, 1);
// All of the following calls return false:
AreEqual(1, 2);
AreEqual(1, 2, 1);
AreEqual(1, 7, 3, 1);
AreEqual(1, 4, 1, 1, 1);
}
如何实现接受任意数量参数的函数AreEqual()?
微不足道但乏味的灵魂是通过重载:
bool AreEqual(int v1, int v2);
bool AreEqual(int v1, int v2, int v3);
bool AreEqual(int v1, int v2, int v3, int v4);
......
另一个微不足道但不可行的解决方案是:
bool AreEqual(...);
此解决方案不可行,因为调用者必须添加另一个参数(参数计数或结束标记)来指定参数的数量。
另一种方法是通过可变参数模板参数
template<class... Args>
bool AreEqual(Args... args)
{
// What should be placed here ???
}
【问题讨论】:
-
“任意”是指“任意类型的整数(例如前两个是
ints,第三个是long)”还是“任意数量的参数同类型”? -
您可以将参数声明为
long long,您将能够传递整数、短裤、长整数、字符、布尔值以及精度较低的任何内容。 -
您究竟为什么要避免使用
f(...)? -
@bames53,这个解决方案不可行,因为调用者必须传递一个参数来指定参数的数量。
-
@ValekHalfHeart 当然,但这既会强制转换(可能不是什么大问题),也可能会阻止该函数与自定义整数类型(例如大整数)一起使用。例如,@Rob 的解决方案适用于定义了
operator==的所有类型。
标签: c++ function templates c++11 variadic-templates