gpt4 book ai didi

c++ - 如何选择带有类型参数的成员变量?

转载 作者:太空狗 更新时间:2023-10-29 20:18:40 25 4
gpt4 key购买 nike

我有一个缓存对象,它缓存了许多不同类型的对象,如下图所示:

class Cache
{
public:
ObjectTable<ObjTypeA> m_objACache;
ObjectTable<ObjTypeB> m_objBCache;
ObjectTable<ObjTypeC> m_objCCache;
};

目前我使用缓存的(可怕的)方式是直接访问缓存类属性“m_objACache”和“m_objBCache”,如下所示:

Cache c;
c.m_objACache.getObjectWithid(objectBuffer, 1);
c.m_objACache.getObjectWithid(objectBuffer, 2);
c.m_objBCache.getObjectWithid(objectBuffer, 3);

等..

我想做的是这样的:-

class Cache
{
public:
template <typename T>
void getObjectWithId(T &objectBuffer, int id)
{
ObjectTable<T>.getObjectWithId(objectBuffer, id);
}
};

但显然这不起作用,因为在我有“ObjectTable<T>”的地方我需要一个变量名,但我不能模板类变量 - 那么我有办法做到这一点吗?或者如果声明所有变量并像这样访问它是否会成为一种情况:

class Cache
{
public:
void getObjectWithId(ObjTypeA &objectBuffer, int id)
{
m_objACache.getObjectWithId(objectBuffer, id);
}

void getObjectWithId(ObjTypeB &objectBuffer, int id)
{
m_objBCache.getObjectWithId(objectBuffer, id);
}

void getObjectWithId(ObjTypeC &objectBuffer, int id)
{
m_objCCache.getObjectWithId(objectBuffer, id);
}

protected:
ObjectTable<ObjTypeA> m_objACache;
ObjectTable<ObjTypeB> m_objBCache;
ObjectTable<ObjTypeC> m_objCCache;
};

这看起来很冗长..

ObjectTable 可用于的每个对象类型都有一个公共(public)基类,因此可能有一些其他方法可以执行此操作,这可能不可避免地涉及向下转型,但我希望我能找到更好的方法。

谢谢!

最佳答案

也许像这样?

class Cache
{
// An "envelope" type which up-casts to the right ObjectTable<T>
// if we have a type parameter T.
struct ObjectTables : ObjectTable<ObjTypeA>,
ObjectTable<ObjTypeB>,
ObjectTable<ObjTypeC> {};

ObjectTables tables;
public:

template <typename T>
void getObjectWithId(T &objectBuffer, int id)
{
// C++ does the work here
ObjectTable<T> &o=tables;
t.getObjectWithId(objectBuffer, id);
}
};

此外,它易于扩展。如果您需要支持更多类型,只需添加更多 ObjectTables<>。

关于c++ - 如何选择带有类型参数的成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3422106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com