【发布时间】:2015-05-08 20:49:13
【问题描述】:
我看过这些问题:
但他们不考虑可变参数函数和可变参数模板。
考虑编写一个函数来求 2 个或 3 个正数的平均值的问题。
我们可以通过四种方式来实现这个功能:
-
使用默认参数:
int average(int x , int y , int z=-1); -
使用函数重载:
int average(int x , int y); int average(int x , int y , int z); -
int average(int x,int y, ...); -
int sum=0; int count=0; void average(){ return; } template <class A, class ...B> void average(A argHead, B... argTail){ sum =sum+argHead; count+=1; average(argTail...); }
使用一种方法相对于另一种方法的优缺点是什么?
【问题讨论】:
-
3 不是类型安全的。在 1 和 2 之间进行选择取决于函数在做什么。
-
如你所见,他们都必须解决同样的问题。
-
另外,对于数字 3,您并不真正知道有多少参数,您需要手动从堆栈中获取参数并转换为正确的类型(同时希望用户传递正确值)。
-
关于 1 和 2,仅针对此特定用例,对于 1,您必须在函数内部保留一个特殊情况以检查
z是否为-1并且不使用其中的变量案子。使用方法 2,您不需要任何特殊情况。 -
@JoachimPileborg 您提供的是差异而不是利弊。
标签: c++ performance function variadic-templates variadic-functions