我正在尝试围绕以下类模板编写 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/