C/C++没有指定形参名传参的用法么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
xuchkang171
V2EX    程序员

C/C++没有指定形参名传参的用法么?

  •  
  •   xuchkang171 2014-09-03 01:37:05 +08:00 3691 次点击
    这是一个创建于 4064 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如
    void fun(int a, float b, int *pint = NULL, char *pch = NULL);
    我调用fun想传 a b pch 三个参数
    int a = 0; float b = 3.1f, char *p = (char *)0x0014ff00;
    想用
    fun(a, b, pch = p)来调用
    印象中就类似上面这样用 但少了点什么
    我知道重载或不定参数个数函数或调用时不用的参数用NULL占位都能解决
    但清楚记得有指定形参名传参的用法又找不到答案很纳闷。。T_T
    11 条回复    2014-09-03 18:40:44 +08:00
    typcn
        1
    typcn  
       2014-09-03 01:43:43 +08:00
    好像不能吧。传数组或者自定义数据类型还差不多
    acros
        2
    acros  
       2014-09-03 01:55:11 +08:00 via iPad
    没有...新标准里面有没有不知道,没确认过。
    但是想想,c++里面对于形参来说名字只是助记的,声明里面都可以留空,编译器肯定不会依赖名字啊。
    TMBest
        3
    TMBest  
       2014-09-03 07:49:17 +08:00 via Android
    不能
    Monad
        4
    Monad  
       2014-09-03 08:10:16 +08:00 via iPhone
    boost.parameter
    其实我觉得还不如封一个结构体.然后给你想要改的字段赋值
    wisatbff
        5
    wisatbff  
       2014-09-03 08:13:23 +08:00
    楼主的头像又是逼死强迫症
    geodesy
        6
    geodesy  
       2014-09-03 09:53:10 +08:00
    指定形参名传参 奇葩的需求。。。楼主的C基础太弱了。。

    首先 你要搞清楚 什么是形参? 字面上理解 形式参数 只是个形式~ 也就是形参的变量名称可是任意的。。我举个例子吧

    int fun(int a, int b)
    {return a+b;}

    这里的a,b就是形参,它被函数内部使用。

    调用这个函数

    int a(1),b(2),c(3),d(4);
    int e=fun(a,b);
    int f=fun(c,d);

    既然定义了函数,只要符合函数声明的变量类型,均可以作为参数传递~~
    caoyue
        7
    caoyue  
       2014-09-03 11:17:52 +08:00
    @geodesy
    楼主的意思似乎跟你不一样……

    楼主说的应该是 Named parameter 这个特性?
    http://en.wikipedia.org/wiki/Named_parameter
    pright
        8
    pright  
       2014-09-03 16:57:56 +08:00
    fun(a, b, pch = p)这样调用效果和fun(a, b, p, NULL)没有区别,后面的pch = p作为表达式会先运算出结果p再传递给pint,编译不过就是了。
    C/C++语法上是不支持楼主想要的这个特性的。
    cxxrocks
        9
    cxxrocks  
       2014-09-03 18:02:21 +08:00
    函数调用没见过命名参数的,

    模板参数可以做到命名参数

    效果
    ===============
    template <class P1 = DefaultP1,
    class P2 = DefaultP2>
    class Foo{};

    不用这个技术,当只需要定制P2时,P1也得被写上。
    Foo<DefaultP1, CustomP2>

    使用这个技术:
    Foo<P2_is<CustomP2> >


    实现办法
    ===============
    class Default{
    typedef DefaultP1 P1;
    typedef DefaultP2 P2;
    };

    class DefaultArgs : virtual public Default{
    };

    template <class P>
    class P1_is : virtual public Default{
    typedef P P1;
    };

    template <class P>
    class P2_is : virtual public Default{
    typedef P P2;
    };

    template <class D, int I>
    class Arg: public D{
    };

    template <class D1, class D2>
    class Select : public Arg<D1,1>, public Arg<D2,2>{
    };

    template <class P1 = DefaultArgs,
    class P2 = DefaultArgs>
    class Foo{
    public:
    typedef Select<P1,P2> Selection;
    };

    预期结果
    ===============
    std::is_same < typename Foo<P2_is<Bar> >::Selection::P2, Bar >::value == true

    来自《C++ Templates》 16.1
    cxxrocks
        10
    cxxrocks  
       2014-09-03 18:37:58 +08:00
    忽然想到了一个办法,

    class Foo{
    int a_;
    int b_;
    int c_;
    public:
    Foo():a_(10),b_(10),c_(10){};
    virtual ~Foo(){};
    static Foo& make(){return new Foo();};
    Foo& setA(A a){a_ = a;};
    Foo& setB(B b){b_ = b;};
    Foo& setC(C c){c_ = c;};
    int sumABC(){return a_ + b_ + c_;} const;
    };

    使用:

    Foo* f = Foo::make();
    f->setB(200)->setC(100)->sumABC(); // == 310
    cxxrocks
        11
    cxxrocks  
       2014-09-03 18:40:44 +08:00
    手一滑,出来个bug

    Foo& setA(A a){a_ = a;};
    Foo& setB(B b){b_ = b;};
    Foo& setC(C c){c_ = c;};

    改成

    Foo* setA(int a){a_ = a;return this;};
    Foo* setB(int b){b_ = b;return this;};
    Foo* setC(int c){c_ = c;return this;};
    关于     帮文档     自助推广系统     博客     API     FAQ     Solana     2584 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 02:24 PVG 10:24 LAX 19:24 JFK 22:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86