使用模板化函数覆盖虚函数

时间:2016-04-19 10:24:28

标签: c++ templates polymorphism

我有一个带有纯虚函数的基类:

class Allocator 
{
public:
    template< class T >
    virtual T* allocate(T type) = 0;
};

使用带有模板化函数的派生类,其设计意图是覆盖此虚函数:

class StackAllocator: public Allocator 
{
public: 
    StackAllocator(size_t size, void* stackStart = nullptr);

    template< class T>
    T* allocate(T Type);
};

我的设计意图是在Allocator中分配覆盖分配。但显然在阅读完之后,我发现上面的代码不起作用。

我发现很多解决方案都涉及使类本身成为模板,但在这种情况下我无法做到这一点,因为StackAllocator本身在编译时需要与类型无关。只有函数才能处理不同的类型。

我找到了一个解决方案,包括进行分配&#39;在每个分配基础上使用的类处理分配本身,但这似乎是浪费而且在其应用中不是很清楚,所以现在我只是简单地摆脱虚函数并仅使用模板派生类功能

我有什么想法可以做到这一点?或者如何重新设计我的设计的想法? (请记住,我最终会制作更多派生的分配器,因此必须使用基础。)

谢谢!

1 个答案:

答案 0 :(得分:0)

想象一下这段代码是否有效,您将如何使用它?

你会有一些东西会被分配器参数化,但由于它返回了特定的类型,因此该东西必须知道如何处理该特定类型。这意味着代码要么不是通用的(这意味着没有理由拥有公共基类,因为代码必须专门用于特定的分配器类型),或者模仿从分配器中获取匹配类型,但是没有因为你可以创建一个非常具体的工厂类(allocator)来匹配使用它的事物的模板化类型。

您并不真正需要模板化的分配方法 - 因为特定的分配器子类不能生成任何类型。它只能使其成为一种特定类型。听起来对我来说可能你想用部分专业来实现这个目标吗?

http://en.cppreference.com/w/cpp/language/partial_specialization

并使用那些模板化的东西到您想要创建的类型的部分特化?