我有以下示例:
struct Wrapper
{
virtual ~Wrapper()
{
}
template <typename U>
WrapperT<U> * clone()
{
return new WrapperT<U>(value); //will not work, because value is not known here
}
};
template <typename T>
struct WrapperT : Wrapper
{
explicit WrapperT(T v)
{
value = v;
}
T value;
};
我想要这样的东西:
Wrapper *t = new WrapperT<int>(1);
WrapperT<double> *t2 = t->clone<double>();
我知道虚拟模板不可用。有任何想法吗?
最佳答案
一种可能的方法是定义访问者模式,但是如果您要支持许多不同的包装类型(即,如果它不仅仅是一个小的子集),则实现访问者的成本可能会很高。
您会遇到的另一个问题是,转换将(必须)动态分派(dispatch),因此转换可能会在运行时失败,并且您必须提供机制来检测并随后采取行动(想到的异常(exception))。没什么可怕的...