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

2014-09-03 01:37:05 +08:00
 xuchkang171
比如
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
3186 次点击
所在节点    程序员
11 条回复
typcn
2014-09-03 01:43:43 +08:00
好像不能吧。传数组或者自定义数据类型还差不多
acros
2014-09-03 01:55:11 +08:00
没有...新标准里面有没有不知道,没确认过。
但是想想,c++里面对于形参来说名字只是助记的,声明里面都可以留空,编译器肯定不会依赖名字啊。
TMBest
2014-09-03 07:49:17 +08:00
不能
Monad
2014-09-03 08:10:16 +08:00
boost.parameter
其实我觉得还不如封一个结构体.然后给你想要改的字段赋值
wisatbff
2014-09-03 08:13:23 +08:00
楼主的头像又是逼死强迫症
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
2014-09-03 11:17:52 +08:00
@geodesy
楼主的意思似乎跟你不一样……

楼主说的应该是 Named parameter 这个特性?
http://en.wikipedia.org/wiki/Named_parameter
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
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
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
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;};

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/131409

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX