设计记录器以转储用户定义的结构

时间:2013-04-10 23:03:07

标签: c++ templates inheritance derived-class

我想要存储在地图中的一些用户定义的结构(无法更改) 在我的Logger类中。 即。

class Logger {
private:
map<string, vector<myType*> > myLog;
}

当然,我不能这样做,因为Logger不是模板类。我认为没有足够的理由改变它。

因此,我创建了一个BaseClass来解决用户定义的结构不从公共基础继承的事实。

class MyTypeBase {
}

template <typename T>
class MyTypeDerived : MyTypeBase {
void DoStuff(const T* tPtr);

private:
vector<T> myList;
} 

使我的Logger类看起来像:

class Logger {
LogState(const A* aPtr); 
LogState(const B* bPtr); 

private:
map<string, vector<MyTypeBase*> > myLog;
}

我正在使用LogState的重载版本来解决模板化Logger对我没有意义的事实。

我面临的问题是在LogState(..)中,我想调用DoStuff来处理输入。由于我的基类没有这个函数而且没有模板化,我无法调用它。

在客户端代码中,我希望它是:

Logger::LogState(aPtr);
Logger::LogState(bPtr);

Logger应该做一些巫术魔法,将这些状态推入地图并以无缝方式处理它们。

我看到了几个与此类似的问题,其中一些评论提到了boost :: any和boost :: shared_ptr;如果有人可以详细说明这些选项,那将非常有用。

谢谢!

编辑1: 它有点愚蠢,我希望我的Logger类每个我打算转储的结构都有一个LogState方法。这与所有这些类型使用单个容器(地图)相结合,加剧了我的问题。

假设我有一个StateLogger模板类(单例)可以解决上面的问题。 所有好东西都是在编译时为我生成的,我可以为我想要的每个结构存储数据包。

My Logger类(也是一个单例)将是StateLoggers与之交互的东西。 这样,我就可以将状态特定逻辑与通用逻辑分离。

让我再考虑一下这个问题了。解决橡皮鸭问题很酷。

0 个答案:

没有答案