这里由于代码需要其实是自己懒,自行研究了一下 C++ 的不定参系统。这篇文章对于 OIer 来说应该是够用了。
代码均以求若干个数的模 mod
意义下和为例子。
va_list
系 (C)
示例
1 |
|
优点
C 语言只能用这个,就没啥别的优点了(
这个在 C 库的应用比较广泛,所以应该熟练掌握如何调用(大雾
缺点
拥有 C 的各种缺点。传参直接面向内存,导致类型转换非常麻烦,容易出错和越界。
必须传一个参数使得能够推断出参数类型和个数,非常麻烦。比如 printf
就要传一个 const char*
,用格式符推断类型和个数。
格式十分严格,不加 va_end
会引发内存问题。
模板类 (C++)
示例
1 | int Add(int t) { |
优点
写起来帅。在 C++98 中可用,可读性也比较高。
调用起来比较省心,不会反直觉,是真正意义上的不定参(
缺点
只能递归调用,会带来一定的常数。
写的时候要注意是从右往左推上来的,要细心处理,不然容易错。
std::initializer_list
(C++11)
示例
1 |
|
优点
写起来贼方便,完全符合 C++ 具名规范,容易操作。
这一个优点就够强了,还要啥自行车(
缺点
调用的时候那个花括号太难受了(
感觉上 STL 可能会带个大常数,实际上跟模板写法的递归差不多(O2)。