我想要存储在地图中的一些用户定义的结构(无法更改) 在我的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与之交互的东西。 这样,我就可以将状态特定逻辑与通用逻辑分离。
让我再考虑一下这个问题了。解决橡皮鸭问题很酷。