如何动态转换模板类

时间:2016-03-27 23:58:41

标签: c++ template-classes typecasting-operator

我正在尝试围绕以下类模板编写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>

1 个答案:

答案 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)方法