前几天在论坛C++版块里看到一个帖子,求教一个让函数参数缺省为同一参数表里的其他参数的方法。『其连接为:
http://topic.youkuaiyun.com/u/20081101/13/743fffff-5f5d-4077-91e1-3465748372d5.html』
大体解决方案有二:
1)在函数体中进行参数特征的判断。该方法的缺点在于很难找到一个合适的判断条件,假如用户的输入正好符合该判断条件(即判断为缺省语义,而这并非用户的本意),程序的行为便可能是错误的。另一个缺点是参数接口的语义不明确,很多情况下,让用户感觉 不舒服的接口会成为经常被错误使用的地方。
2)重载。这无疑是个很不错的方案,既解决了问题,又提供了干净明确的接口。可能会有一种顾虑是重载可能会造成部分代码的重复,以致源文件的增大。但请考虑一下,这样的增大会很明显吗?假如真的出现了明显增长的情况,恐怕真正该做的是把以前的推到,重新设计。
昨天看了csdn电子杂志上的一篇关于可变参数的文章,『链接为: http://blog.youkuaiyun.com/AlwaysSLH/archive/2008/11/05/3230242.aspx』。
突然有一个想法,可以使用可变参数来实现上述问题。自己实现了一下,贴代码于下:
void func(int count, int a, ...) //增加count参数来指明其后参数个数
{
va_list arg_ptr;
int b;
if(count == 1)
{
b = a;
}
else
{
va_start(arg_ptr,a);
b = va_arg(arg_ptr,int);
va_end(arg_ptr);
}
//do something here...
}
这并不是一个很好的实现,诚然它存在以下不足之处:
1)接口参数总会或多或少让人感觉不友好。比如上边代码中额外增加的参数count,和重载相比这个接口难免太过笨重。
2)因为可变参数不会对可变实参进行类型检测(甚至连数目上的限制都没有),故该实现能够正常工作的先决条件基于一个假设:用户已经了解了函数的接口,并且任何情况下都不会用错。现实中这个假设很难达到,一旦出错,编译器不会给出任何提示,这就给测试和调试带来了很大的难度。
由于上述的种种不足,该方法在C++下没有任何吸引力,更可能被视为是一种不安全的方法而被提倡禁用。但在没有缺省参数和重载、并且类型安全不是很强烈的C中这或许是模拟缺省构造和重载的好方法。也许永远不会被使用,但可变参数确实可以一定程度上在形态上模拟C++中的缺省函数和重载。
大体解决方案有二:
1)在函数体中进行参数特征的判断。该方法的缺点在于很难找到一个合适的判断条件,假如用户的输入正好符合该判断条件(即判断为缺省语义,而这并非用户的本意),程序的行为便可能是错误的。另一个缺点是参数接口的语义不明确,很多情况下,让用户感觉 不舒服的接口会成为经常被错误使用的地方。
2)重载。这无疑是个很不错的方案,既解决了问题,又提供了干净明确的接口。可能会有一种顾虑是重载可能会造成部分代码的重复,以致源文件的增大。但请考虑一下,这样的增大会很明显吗?假如真的出现了明显增长的情况,恐怕真正该做的是把以前的推到,重新设计。
昨天看了csdn电子杂志上的一篇关于可变参数的文章,『链接为: http://blog.youkuaiyun.com/AlwaysSLH/archive/2008/11/05/3230242.aspx』。
突然有一个想法,可以使用可变参数来实现上述问题。自己实现了一下,贴代码于下:
void func(int count, int a, ...) //增加count参数来指明其后参数个数
{
va_list arg_ptr;
int b;
if(count == 1)
{
b = a;
}
else
{
va_start(arg_ptr,a);
b = va_arg(arg_ptr,int);
va_end(arg_ptr);
}
//do something here...
}
这并不是一个很好的实现,诚然它存在以下不足之处:
1)接口参数总会或多或少让人感觉不友好。比如上边代码中额外增加的参数count,和重载相比这个接口难免太过笨重。
2)因为可变参数不会对可变实参进行类型检测(甚至连数目上的限制都没有),故该实现能够正常工作的先决条件基于一个假设:用户已经了解了函数的接口,并且任何情况下都不会用错。现实中这个假设很难达到,一旦出错,编译器不会给出任何提示,这就给测试和调试带来了很大的难度。
由于上述的种种不足,该方法在C++下没有任何吸引力,更可能被视为是一种不安全的方法而被提倡禁用。但在没有缺省参数和重载、并且类型安全不是很强烈的C中这或许是模拟缺省构造和重载的好方法。也许永远不会被使用,但可变参数确实可以一定程度上在形态上模拟C++中的缺省函数和重载。