基本上我想完成这个Conversion between 2 template types
但我希望赋值运算符或复制构造函数是专用的。
例如,我有一个颜色类:
template<typename T = float>
class color
{
public:
T r;
T g;
T b;
T a;
color(T R, T G, T B, T A)
: r(R), g(G), b(B), a(A)
{
}
};
通常,float
和0
之间的颜色成分需要1
。但是,将组件作为0
和255
之间的数字提供通常会更容易,因为这通常是您在Photoshop或GIMP中获得的。
因此,我希望此类的实例能够在float
和int
类型之间进行转换:
color<int> c1(255,234,122,14);
color<float> c2 = c1;
当它执行此操作时,c1
中的数字除以255
,以获得0
到1
等效数字。
所以到目前为止我已经这样做了:
template<typename U>
color<T>(color<U> c)
: r(c.r/255.0), g(c.g/255.0), b(c.b/255.0), a(c.a/255.0)
{
}
但是这也会将float
实例除以255。我无法弄清楚如何专门化这个构造函数(或赋值运算符)只对int
到float
的特化有效。
答案 0 :(得分:1)
修改强>
也许这确实解决了你的问题。您只想完全专门化转化的构造函数color<int>
- &gt; color<float>
,反之亦然。这是允许的。
#include <iostream>
using namespace std;
template<typename T>
class color
{
public:
T r,g,b,a;
color(T r, T g, T b, T a) : r(r), g(g), b(b), a(a) {}
template<typename OtherT>
color(const color<OtherT>&);
};
template<>
template<>
color<int>::color(const color<float>& other) :
r(other.r * 255),
g(other.g * 255),
b(other.b * 255),
a(other.a * 255)
{}
int main() {
color<float> c1 = { 1.0f, 1.0f, 1.0f, 1.0f };
color<int> c2 = c1;
cout << c2.r << " " << c2.g << " " << c2.b << " " << c2.a << endl;
return 0;
}
我认为我的老答案,但是如果用户输入除int或float之外的模板参数,则会产生难以理解的错误。另一种方法非常明确。
旧答案
您想要的主要问题是您不能在类模板中部分专门化单个方法。
如果用于模板类颜色的唯一两个参数是int和float,我会这样安排:有一个包含公共代码的基本模板类,以及从它派生并提供专门构造函数的两个类。 / p>
template<typename T> class base_color { ... common code between int and float };
然后是两个具有特定转换构造函数的类
class int_color : public base_color<int>
{
public:
int_color(const float_color&) { ... }
}
class float_color : public base_color<float>
{
public:
float_color(const int_color&) { ... }
}