5

我正在尝试围绕以下类模板编写 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, (via (MyClass<C, D>)MyClass<A, B>) 类型之间动态转换,还是我完全失去了它?



示例实现:

/*
  * --- INCLUDE ABOVE CLASS DEFINITION HERE ---
*/

#include <iostream>
#include <string>

int main() {
    MyClass<int, char> foo(42, 'q');
    MyClass<double, std::string> bar;

    bar = (MyClass<double, std::string>) foo;
}
4

1 回答 1

1

回答:是的。

但是您必须提供 C 运算符 C (A) 和 D 运算符 D (B) 的所有变体,并且您需要这样的复制构造函数:

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) 方法中

于 2016-03-28T14:45:38.653 回答