如何使类或结构的名字可以返回值?

player7 2007-03-26
比如:

myClass var;
var=1;   // 这个可以通过重载运算符=实现
var=var+3; //同上

printf("var=%d",var);   // ????  怎么实现???
qiezi 2007-03-26
加个转换方法吧,这样用你自己也不会太放心吧?

printf("var=%d", var.to_i);
oldrev 2007-03-26
> 如何使类或结构的名字可以返回值
你搞错了吧,是不是要问“如何使对象的名字返回值”?
结构的名字可以返回值是可以实现的,重载 static opCall 即可

> printf("var=%d",var); // ???? 怎么实现???
这是一个 C函数,也不是模板,编译时 printf 并不知道 var 的类型,只能在运行时根据 %d 提供的类型处理。C++有重载用户自定义类型转换,但是会引起很多问题,一般不推荐使用。
jinheking 2007-04-02
char[]  toString(){}
这个可能可以实现你的功能
player7 2007-04-03
我的目的就是想做一个自己的INT型,并且能有赋值检查功能,并且和原始的INT型无差别...

void main(){
     myint!(int) v;
	 v=12;
//	 int k=test(v);   
//这句通不过编译,function r1.test (int) does not match parameter types (myint!(int) )

	 printf("v=%d",v);  //这句没问题,能输出12
	
}

struct	 myint(T){
	T	opAssign(T a){return v=a;}
	T  	opCall(){return this.v;}

	private:
	T v;
}

int test(int t){return t+13;}
oldrev 2007-04-03
前面的回复我已经说了
     printf("v=%d",v);  //这句没问题,能输出12 
这行能正确输出是巧合,因为 struct myint!(int) 刚好只有一个int成员
第4行通不过编译是因为myint!(int)这个类型不是 int,这是C++/D/C#的 基本常识
player7 2007-04-03
int k=test(v);
V当然不是INT型,但这里实际应该调用的是V() ,而V()应该可以简写成V的嘛.

当写成: int k=test(v());  //正确

或者: 
int v(){return 12;}
int k=test(v);    //也行,当一个函数没有参数,可以省略括号.

现在的问题是:当V是某结构的方法时,似乎就不能省略括号了???
achun 2007-04-03
哦,看出来了,D语言这种表面上语法的智能,
其实不可取呀,也就是说隐式的类型转换
这种特性要不得呀!
如果D不改变这一点的话.........
我用的时候会产生心里压力的.
oldrev 2007-04-03
opCall 本身就说明了是重载 ()的,肯定不能省略(),否则就变成隐式类型转换了
用户自定义的隐式类型转换非常危险,More Effective C++ 第五条对此有详细解释
Global site tag (gtag.js) - Google Analytics