【发布时间】: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<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.我不认为我完全理解。您能否提供可行的替代方案?
标签: c++ template-classes typecasting-operator