【问题标题】:How to Dynamically Cast a Template Class如何动态转换模板类
【发布时间】:2023-04-01 00:10:02
【问题描述】:

我正在尝试围绕以下类模板编写 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&lt;C, D&gt;)MyClass&lt;A, B&gt;)或者让我彻底丢了?



示例实现:

/*
  * --- 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;
}

【问题讨论】:

  • 你能提供一个最小的可编译测试程序吗?这个问题很酷。
  • 对于dynamic_cast 执行的操作,请使用术语“动态转换”以避免混淆。您所展示的内容没有任何动态。您看起来很疯狂的功能看起来无效。类型转换由Class::operator TYPE() 非静态成员函数(无参数,无显式返回类型——从 Class 到 TYPE 的转换)或单参数构造函数 Class::Class(TYPE) (从 TYPE 到 Class 的转换)指定。
  • @n.m.抱歉,我没有意识到类型转换运算符不被认为是“动态的”。也许我应该回顾一下类型转换术语。
  • @n.m.我不认为我完全理解。您能否提供可行的替代方案?

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


【解决方案1】:

答案:是的。

但你必须提供 C 运算符 C (A) 和 D 运算符 D (B) 的 ALL VARIANTS OF C 运算符,并且你需要这样的复制构造函数:

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

【讨论】:

  • 澄清一下:“所有变体...”是指从MyClass&lt;int, char&gt; 转换为MyClass&lt;double, string&gt;double operator double (int)string operator string (char) 都必须定义,对吗?
猜你喜欢
  • 2012-08-23
  • 2020-07-08
  • 1970-01-01
  • 2019-11-10
  • 2018-02-14
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多