首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您能在指向不同模板类实例的指针之间进行转换吗?

您能在指向不同模板类实例的指针之间进行转换吗?
EN

Stack Overflow用户
提问于 2018-07-26 02:11:43
回答 1查看 100关注 0票数 1

假设我有一个名为Pool的容器类模板和一个名为PoolObject的抽象类

类模板Pool允许用户创建包含特定类型池对象的池。例如:

代码语言:javascript
复制
template<class T, size_t pool_size>
Pool()
{
    // assert that type T is derived from PoolObject

    public:
        int grab(){};
        void release(int object_id){};

    private:
        std::array<T, pool_size> pool_members_;
}

现在假设我想创建几个不同的池来管理几个不同的对象类型。

代码语言:javascript
复制
class PoolObject1 : public PoolObject{};
class PoolObject2 : public PoolObject{};
class PoolObject3 : public PoolObject{};
class PoolObject4 : public PoolObject{};

Pool<PoolObject1, 100> pool_1;
Pool<PoolObject2, 100> pool_2;
Pool<PoolObject3, 100> pool_3;
Pool<PoolObject4, 100> pool_4;

现在假设我想创建一个用于抓取池对象的工厂函数,以及一个用于释放池对象的破坏函数。一个简单的实现将以一个switch语句为特色,以确定应该使用哪个池。

代码语言:javascript
复制
int factory(int object_type)
{
    switch(object_type)
    {
        case 1:
        return pool_1.grab();

        case 2:
        return pool_2.grab();

        case 3:
        return pool_3.grab();

        case 4:
        return pool_4.grab();

    }
}

虽然很简单,但对于在这些池上操作的任何方法,我都必须实现相同的case语句。例如,破坏方法。

代码语言:javascript
复制
void destroy(int object_type, int object_id)
{
    switch(object_type)
    {
        case 1:
        return pool_1.release(object_id);

        case 2:
        return pool_2.release(object_id);

        case 3:
        return pool_3.release(object_id);

        case 4:
        return pool_4.release(object_id);
    }
}

当定义了更多的对象类型时,switch语句就会增长,这就会使管理和更新每个方法变得很痛苦。

一个更简单的解决方案是有一个查找表来获取所讨论的池,然后调用适当的方法。

例如,我可以尝试在数组中存储指向每个池的指针。

代码语言:javascript
复制
std::array<void*, 4> pool_ptrs =
{
    &pool_1,
    &pool_2,
    &pool_3,
    &pool_4
};

通过拥有这个池指针数组,我现在可以重写工厂和销毁方法,如下所示:

代码语言:javascript
复制
int factory(int object_type)
{
    return static_cast<Pool*>(pool_ptrs[object_id])->grab();
}

void destroy(int object_type, int object_id)
{
    return static_cast<Pool*>(pool_ptrs[object_id])->destroy(object_id);
}

但是,这段代码不会编译。编译器抱怨我的Pool*缺少模板参数。

因此,我理解为什么我的代码不编译,但是,我不知道什么是合适的解决方案。实际上,我想使用类模板作为“抽象类”。我不想转换指向Pool<Object1, 100>的指针或指向Pool<Object2, 100>的指针,我只想转换一个指向Pool的指针

所以我的问题是:您能在指向不同模板类实例的指针之间进行转换吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-26 09:23:06

答案是微不足道的:

是的,您可以转换指针,不同的实例共享一个公共基类。就像普通的类型一样。您需要添加一个PoolBase。请注意,这不是一个模板,它是常见的非模板接口。

不,您不能有一个PoolBase::get(int object_type),它根据运行时条件object_type返回一个PoolObject1PoolObject2PoolObject3。返回类型在编译时确定。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51530020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档