我有一个自定义类,它充当一个名为Integer的int,我想告诉编译器如何自动将某些类型转换为Integer,这样我就可以避免一次又一次地输入相同的东西,从内置类型到自定义类的转换
someCall(Integer(1), Integer(2));
将成为
someCall(1,2);
我GOOGLE了,但所有我能找到的就是做oposite,铸造整数为int我想完成相反。
我有一个自定义类,它充当一个名为Integer的int,我想告诉编译器如何自动将某些类型转换为Integer,这样我就可以避免一次又一次地输入相同的东西,从内置类型到自定义类的转换
someCall(Integer(1), Integer(2));
将成为
someCall(1,2);
我GOOGLE了,但所有我能找到的就是做oposite,铸造整数为int我想完成相反。
写一个构造函数int
,如:
class Integer
{
public:
Integer(int);
};
如果该类Integer
有此构造,那么你可以这样做:
void f(Integer);
f(Integer(1)); //okay
f(1); //this is also okay!
的解释是,当你写f(1)
,那么Integer
的构造函数会自动调用一个类型为int
的单参数,并创建一个临时的动态,然后该临时被传递给函数上!
现在假设你想要做的完全相反,即,通过Integer
类型的对象给一个函数需要int
:
void g(int); //NOTE: this takes int!
Integer intObj(1);
g(intObj); //passing an object of type Integer?
为了让上面的代码工作,你需要的是在类作为定义一个用户定义的转换函数:
class Integer
{
int value;
public:
Integer(int);
operator int() { return value; } //conversion function!
};
因此,当你经过Integer
类型的一个目的是这需要01的功能,然后转换函数被调用,并且对象隐含转换为int
然后传递给函数作为参数。你也可以这样做:
int i = intObj; //implicitly converts into int
//thanks to the conversion function!
你可以定义Integer中的构造函数,用于你想要隐式转换的类型。不要让他们explicit
。
纳瓦兹给出了正确的答案。我只想指出一些。 如果转换操作不是const的,你不能转换const对象变成
const Integer n(5);
int i = n; // error because non-const conversion operator cannot be called
更好的声明转换运算符,
operator int() const {return value;}
+1好点。我喜欢它。 :-) – Nawaz 2011-04-22 14:48:49
理论上,应该转换为'INT&'和'const int的&',我认为。 – Puppy 2011-04-22 14:49:39
纳瓦兹你建议的作品,但我有回报(n <2)? 1:IntegerFromACall;这给了我,错误:操作数为?:有不同的类型'int'和'Integer' – 2011-04-22 15:07:05
@Hamza:写这个:'return(n <2)? 1:(int)IntegerFromACall;'...这将工作! – Nawaz 2011-04-22 15:10:57