我为我的应用程序定义了三个类:int2_
(整数对),float2_
(浮点数对)和double2_
(双精度对偶),基本上用于复杂算术运算。
经过以下讨论:
和
我实施了以下解决方案
class float2_;
class double2_;
class int2_ {
public:
int x;
int y;
__host__ __device__ int2_() : x(), y() {}
__host__ __device__ inline const int2_& operator=(const int a) { x = a; y = 0.; return *this; }
__host__ __device__ inline const int2_& operator=(const float a) { x = (int)a; y = 0.; return *this; }
__host__ __device__ inline const int2_& operator=(const double a) { x = (int)a; y = 0.; return *this; }
__host__ __device__ inline const int2_& operator=(const int2_ a) { x = a.x; y = a.y; return *this; }
__host__ __device__ inline const int2_& operator=(const float2_ a);
__host__ __device__ inline const int2_& operator=(const double2_ a);
};
class float2_ {
public:
float x;
float y;
__host__ __device__ float2_() : x(), y() {}
__host__ __device__ inline const float2_& operator=(const int a) { x = (float)a; y = 0.; return *this; }
__host__ __device__ inline const float2_& operator=(const float a) { x = a; y = 0.; return *this; }
__host__ __device__ inline const float2_& operator=(const double a) { x = (float)a; y = 0.; return *this; }
__host__ __device__ inline const float2_& operator=(const int2_ a) { x = (float)a.x; y = (float)a.y; return *this; }
__host__ __device__ inline const float2_& operator=(const float2_ a) { x = a.x; y = a.y; return *this; }
__host__ __device__ inline const float2_& operator=(const double2_ a);
};
class double2_ {
public:
double x;
double y;
__host__ __device__ double2_() : x(), y() {}
__host__ __device__ inline const double2_& operator=(const int a) { x = (double)a; y = 0.; return *this; }
__host__ __device__ inline const double2_& operator=(const float a) { x = (double)a; y = 0.; return *this; }
__host__ __device__ inline const double2_& operator=(const double a) { x = a; y = 0.; return *this; }
__host__ __device__ inline const double2_& operator=(const int2_ a) { x = (double)a.x; y = (double)a.y; return *this; }
__host__ __device__ inline const double2_& operator=(const float2_ a) { x = (double)a.x; y = (double)a.y; return *this; }
__host__ __device__ inline const double2_& operator=(const double2_ a) { x = a.x; y = a.y; return *this; }
};
__host__ __device__ inline const int2_& int2_::operator=(const float2_ a) { x = (int)a.x; y = (int)a.y; return *this; }
__host__ __device__ inline const int2_& int2_::operator=(const double2_ a) { x = (int)a.x; y = (int)a.y; return *this; }
__host__ __device__ inline const float2_& float2_::operator=(const double2_ a) { x = (float)a.x; y = (float)a.y; return *this; }
正确定义了int
,float
,double
和int2_
,float2_
和double2_
之间的所有可能分配。
我现在想重载转换()
运算符。为了超载(例如,从int
到float2_
的转换,我将以下行添加到float2_
类
__host__ __device__ inline const float2_& operator()(const int in) { x = (float)in; y=0.; return *this; };
不幸的是,它似乎没有效果。如果我试试
float2_ a;
int b = 1;
a = (float2_)b;
编译器说
no suitable constructor exists to convert from "int" to "float2_"
我应该实现一个包装类,比如int_
,以允许这种类型的转换吗?谢谢。
答案 0 :(得分:1)
您已经超载operator()
获取int
并返回float2_&
。您可以这样使用:
float2_ a;
a(5); // Returns a float2_&
相反,它听起来像你想要一个转换运算符。它们的格式为operator type()
(请注意,没有返回类型)。因此,如果您想要从float2_
转换为int
,则需要在类定义中包含以下内容
operator int() { /* Convert to int and return here */ }
答案 1 :(得分:1)
您没有重载强制转换运算符,而是()
运算符。也就是说,您正在定义一个应该以这种方式使用的运算符:
float2_ a;
float2_ b = a(3); // This is the operator you are overloading
现在,您无法从内置类型(例如int
)定义强制转换运算符,但您可以定义一个显式构造函数,它将提供相同的功能,或多或少:
class float2_
{
public:
//...
float2_(int in) { x = (float)in; y=0. };
}
使用它:
float2_ f;
f = float2_(3); // Or directly float2_ f (3);