可变参数模拟C++中缺省参数及重载

本文探讨了C++中让函数参数缺省为同一参数表里其他参数的方法,包括通过函数体内的参数判断及重载解决。同时介绍了利用可变参数实现这一功能的可能性及其局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    前几天在论坛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++中的缺省函数和重载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值