工作中遇到一个需求,一个模块要处理很多种命令,这些命令定义成了不同的类,其中有些类是“收”命令,有些类是“发”命令。用户定义好命令对象会传给模块,如果是“收”命令,会在一定时间之后,检查传给模块的这个命令对象,看里面的值,收到的东西会写给这个命令对象。所以这些命令,一开始我都在模块内部存成指针,这样一个缺点就是需要保证模块在真正执行这个命令的时候,这个命令没有被析构,不然就成了野指针。
这种粗暴情况下,我存命令的容器用一个std::tuple,里面存的是各种命令指针的std::deque,形如:
template <typename T>
using Ptr = std::deque<T*>;
using AllCmds = std::tuple<Ptr<int>, Ptr<float>, Ptr<double>, Ptr<char>>;
AllCmds cmds;
// 暴露在外面的接口
template<typename EleType>
void PushBack(EleType &ele) {
auto &container = std::get<Ptr<EleType>>(cmds);
container.push_back(&ele);
}
但是这种实现,导致“发”命令时不时地会意外地坑到我——“发”命令如果超出了创建这个命令的生命周期,我模块里面存的相当于野指针了,我就需要非常小心地留意这个问题。所以我就考虑&#