我有一个自定义类,它充当一个名为Integer的int,我想告诉编译器如何自动将某些类型转换为Integer,这样我就可以避免一遍又一遍地输入相同的东西,
someCall(Integer(1), Integer(2));
会变成
someCall(1,2);
我用Google搜索了但是我能找到的只是做对话,将Integer强制转换为int我希望完成相反的操作。
答案 0 :(得分:14)
编写一个带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
的对象传递给取int
的函数时,将调用转换函数并将对象隐含转换为int
,然后传递给函数作为论点。你也可以这样做:
int i = intObj; //implicitly converts into int
//thanks to the conversion function!
答案 1 :(得分:5)
您可以在Integer中为要隐式转换的类型定义构造函数。不要让他们explicit
。
答案 2 :(得分:4)
纳瓦兹给出了正确的答案。我只想指出一些问题。 如果转换运算符不是const,则无法转换const对象
const Integer n(5);
int i = n; // error because non-const conversion operator cannot be called
最好将转化运算符声明为
operator int() const {return value;}