加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何动态转换模板类

发布时间:2020-12-16 06:51:36 所属栏目:百科 来源:网络整理
导读:我正在尝试围绕以下类模板编写API: template class A,class Bclass MyClass { public: A foo; B bar; MyClass(); MyClass(A in1,B in2) { foo = in1; bar = in2; } void operator = (MyClassA,B in) { foo = in.foo; bar = in.bar; }}; 作为此API的一部分,
我正在尝试围绕以下类模板编写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运算符C(A)和D运算符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;
}

解决方法

答:是的.

但是你必须提供所有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)方法中

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读