V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xuchkang171
V2EX  ›  程序员

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

  •  
  •   xuchkang171 · 2014-09-03 01:37:05 +08:00 · 3179 次点击
    这是一个创建于 3523 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如
    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   ·   我们的愿景   ·   实用小工具   ·   4111 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:00 · PVG 09:00 · LAX 18:00 · JFK 21:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.