This topic created in 4292 days ago, the information mentioned may be changed or developed.
比如
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 replies • 2014-09-03 18:40:44 +08:00
 |
|
1
typcn Sep 3, 2014
好像不能吧。传数组或者自定义数据类型还差不多
|
 |
|
2
acros Sep 3, 2014 via iPad
没有...新标准里面有没有不知道,没确认过。 但是想想,c++里面对于形参来说名字只是助记的,声明里面都可以留空,编译器肯定不会依赖名字啊。
|
 |
|
3
TMBest Sep 3, 2014 via Android
不能
|
 |
|
4
Monad Sep 3, 2014 via iPhone
boost.parameter 其实我觉得还不如封一个结构体.然后给你想要改的字段赋值
|
 |
|
6
geodesy Sep 3, 2014
指定形参名传参 奇葩的需求。。。楼主的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);
既然定义了函数,只要符合函数声明的变量类型,均可以作为参数传递~~
|
 |
|
8
pright Sep 3, 2014
fun(a, b, pch = p)这样调用效果和fun(a, b, p, NULL)没有区别,后面的pch = p作为表达式会先运算出结果p再传递给pint,编译不过就是了。 C/C++语法上是不支持楼主想要的这个特性的。
|
 |
|
9
cxxrocks Sep 3, 2014
函数调用没见过命名参数的,
模板参数可以做到命名参数
效果 =============== 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 Sep 3, 2014
忽然想到了一个办法,
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 Sep 3, 2014
手一滑,出来个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;};
|