我有以下示例:

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))。没什么可怕的...

09-06 20:38