1
typcn 2014-09-03 01:43:43 +08:00
好像不能吧。传数组或者自定义数据类型还差不多
|
2
acros 2014-09-03 01:55:11 +08:00 via iPad
没有...新标准里面有没有不知道,没确认过。
但是想想,c++里面对于形参来说名字只是助记的,声明里面都可以留空,编译器肯定不会依赖名字啊。 |
3
TMBest 2014-09-03 07:49:17 +08:00 via Android
不能
|
4
Monad 2014-09-03 08:10:16 +08:00 via iPhone
boost.parameter
其实我觉得还不如封一个结构体.然后给你想要改的字段赋值 |
5
wisatbff 2014-09-03 08:13:23 +08:00
楼主的头像又是逼死强迫症
|
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); 既然定义了函数,只要符合函数声明的变量类型,均可以作为参数传递~~ |
7
caoyue 2014-09-03 11:17:52 +08:00
|
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++语法上是不支持楼主想要的这个特性的。 |
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 |
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 |
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;}; |