我正在尝试围绕以下类模板编写API:
template <class A, class B>
class MyClass {
public:
A foo;
B bar;
MyClass();
MyClass(A in1, B in2) {
foo = in1; bar = in2;
}
void operator = (MyClass<A, B> in) {
foo = in.foo; bar = in.bar;
}
};
作为此API的一部分,我希望实施者能够在不同类型的MyClass
之间动态投射。为了实现这一点,我写了以下函数:
template<class A, class B, class C, class D>
MyClass<C, D> operator MyClass<C, D> (MyClass<A, B> in) {
MyClass<C, D> out((C)in.foo, (D)in.bar);
return out;
}
此代码编译时没有错误。
我的问题:
假设为上述函数的任何给定实现定义C operator C (A)
和D operator D (B)
,这个看起来很疯狂的函数是否足以允许实现者在MyClass
的类型之间动态转换,(通过{ {1}})或者我完全失去了它?
示例实施:
(MyClass<C, D>)MyClass<A, B>
答案 0 :(得分:0)
答案:是的。
但是你必须提供所有C操作符C(A)和D操作符D(B)的VARIANTS,你需要一个像这样的拷贝构造函数:
class MyClass
{
public:
A foo;
B bar;
MyClass(MyClass &cpy)// copy constructor
{
foo = cpy.foo;
bar = cpy.bar;
}
MyClass(A in1, B in2)
{
foo = in1; bar = in2;
}
};
复制构造函数是必需的,以便工作:
return out;
在MyClass(A in1,B in2)方法