Mar*_*ark 3 c++ oop templates design-patterns
我有一个缓存对象,缓存许多不同类型的对象,如下所示:
class Cache
{
public:
ObjectTable<ObjTypeA> m_objACache;
ObjectTable<ObjTypeB> m_objBCache;
ObjectTable<ObjTypeC> m_objCCache;
};
Run Code Online (Sandbox Code Playgroud)
我目前正在使用缓存的(可怕)方式是直接访问缓存类属性"m_objACache"和"m_objBCache",如下所示:
Cache c;
c.m_objACache.getObjectWithid(objectBuffer, 1);
c.m_objACache.getObjectWithid(objectBuffer, 2);
c.m_objBCache.getObjectWithid(objectBuffer, 3);
Run Code Online (Sandbox Code Playgroud)
等等..
我希望能做的是这样的事情: -
class Cache
{
public:
template <typename T>
void getObjectWithId(T &objectBuffer, int id)
{
ObjectTable<T>.getObjectWithId(objectBuffer, id);
}
};
Run Code Online (Sandbox Code Playgroud)
但显然这不起作用,因为我有" 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;
};
Run Code Online (Sandbox Code Playgroud)
这似乎非常冗长..
可以使用ObjectTable的每个对象类型都有一个共同的基类,因此可能还有其他一些方法可能会涉及向下转换,但我希望我能找到更好的方法.
谢谢!
Like this perhaps?
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);
}
};
Run Code Online (Sandbox Code Playgroud)
Also, it's easy to extend. Just throw in more ObjectTables<> if you need to support more types.
| 归档时间: |
|
| 查看次数: |
479 次 |
| 最近记录: |