如何动态转换模板类
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<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;
【问题讨论】:
你能提供一个最小的可编译测试程序吗?这个问题很酷。 对于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<int, char>
转换为MyClass<double, string>
,double operator double (int)
和string operator string (char)
都必须定义,对吗?
以上是关于如何动态转换模板类的主要内容,如果未能解决你的问题,请参考以下文章
如何在 WordPress 中通过模板为 HTML 标签动态添加类
如何动态地将 html 类添加到 Django 模板“for-loop”?