我有一些用户定义的结构(不能更改),我想将它们存储在我的 Logger 类的地图中。IE
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 模板类(单例)。所有好东西都是在编译时为我生成的,我可以为我想要的每个结构存储数据包。
我的 Logger 类(也是一个单例)将是 StateLogger 与之交互的东西。这样,我就可以将状态特定逻辑与通用逻辑分离。
让我再考虑一下。橡皮鸭问题解决太酷了。