从与`this`相同的模板创建实例?

时间:2017-07-07 13:07:48

标签: c++ c++14

我们假设我有一个基类Base<T>和许多Sub1<T>,... SubN<T>,它们是Base的子类。 Base有某种成员函数foofoo我需要创建一个新实例。但我想始终从同一个子模板创建新实例,但使用不同的模板参数(Sub1<T>::foo - &gt; Sub1<U>Sub2<T>::foo - &gt; {{1} },...)。

对于前。 Sub2<U>以便Sub1<float> a; auto b = a.foo();再次成为新的b(即使Sub1<int>仅在foo上重载)。这甚至可能吗?我该怎么做?

1 个答案:

答案 0 :(得分:3)

如果您只想在Base类中实现该方法:

template <typename T, template <typename> class D>
struct Base
{
    template <typename U, typename... Args>
    D<U>* foo(Args&&... args)
    {
        return new D<U>(std::forward<Args>(args)...);
    }
};

template <typename T>
struct Derived1 : Base<T, Derived1>
{
    // Implementation specific to Derived1
};

template <typename T>
struct Derived2 : Base<T, Derived2>
{
    // Implementation specific to Derived2
};

int main()
{
    Derived1<float> d1_float;
    Derived2<float> d2_float;

    auto d1_int = d1_float.foo<int>(); // has type Derived1<int>
    auto d2_int = d2_float.foo<int>(); // has type Derived2<int>

    return 0;
}

但是,现在Derived1Derived2不再共享相同的基类。所以这只有在你使用基类来避免代码重复而不是多态时才有用。