我们假设我有一个基类Base<T>
和许多Sub1<T>
,... SubN<T>
,它们是Base
的子类。 Base
有某种成员函数foo
,foo
我需要创建一个新实例。但我想始终从同一个子模板创建新实例,但使用不同的模板参数(Sub1<T>::foo
- &gt; Sub1<U>
,Sub2<T>::foo
- &gt; {{1} },...)。
对于前。 Sub2<U>
以便Sub1<float> a; auto b = a.foo();
再次成为新的b
(即使Sub1<int>
仅在foo
上重载)。这甚至可能吗?我该怎么做?
答案 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;
}
但是,现在Derived1
和Derived2
不再共享相同的基类。所以这只有在你使用基类来避免代码重复而不是多态时才有用。