如何动态转换模板类

Posted

技术标签:

【中文标题】如何动态转换模板类【英文标题】:How to Dynamically Cast a Template Class 【发布时间】:2016-03-27 23:58:41 【问题描述】:

我正在尝试围绕以下类模板编写 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.我不认为我完全理解。您能否提供可行的替代方案? 例如ideone.com/hIYsui 【参考方案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) 都必须定义,对吗?

以上是关于如何动态转换模板类的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有动态大小数组的模板类中重载 operator=

如何在 WordPress 中通过模板为 HTML 标签动态添加类

如何动态地将 html 类添加到 Django 模板“for-loop”?

如果给定模板参数,是不是有可以将模板类转换为实际类的 C++ 工具? [关闭]

C++:派生模板类和基类之间的向下转换和向上转换?

指向数组的指针的 C++ 模板类动态数组