c++ - 如何动态转换模板类

标签 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 的类型之间动态转换? ,(通过 (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) 的所有变体,并且你需要这样的复制构造函数:

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

关于c++ - 如何动态转换模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36254073/

相关文章:

c++ - 未调用类型转换运算符

c++ - 您会推荐 Todd Hoff 的《C++ 编码标准》吗?

c++ - 具有非推导上下文的部分特化排序

java - One o=(One) new Two(); 的含义是什么?在这个程序中。谁能向我解释一下,这是如何工作的?

c++ - 如何正确使用模板类的嵌套类?

c++ - 模板类类型特定的函数

python - 在 python 中将 numpy 矩阵类型转换为字符串

c++ - 使用 decltype 将其转换为 const

c++ - std::strings 的 std::initializer_list 的奇怪行为

c++ - 将函数模板定义为类模板的回调