判断tuple里面是否有某种类型的容器,然后将一个指针或者实体压入这个容器

本文介绍了在C++中如何判断std::tuple中存储的是对象指针还是实体,并根据判断结果动态选择使用std::deque存储指针或实体。通过std::is_same和变参模板解决第一问题,利用std::enable_if_t解决第二问题,确保接口不变且避免野指针问题。同时,文章提到了Visual Studio中的一些编译陷阱和C++17的if constexpr解决方案。
摘要由CSDN通过智能技术生成

工作中遇到一个需求,一个模块要处理很多种命令,这些命令定义成了不同的类,其中有些类是“收”命令,有些类是“发”命令。用户定义好命令对象会传给模块,如果是“收”命令,会在一定时间之后,检查传给模块的这个命令对象,看里面的值,收到的东西会写给这个命令对象。所以这些命令,一开始我都在模块内部存成指针,这样一个缺点就是需要保证模块在真正执行这个命令的时候,这个命令没有被析构,不然就成了野指针。

这种粗暴情况下,我存命令的容器用一个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);
}

但是这种实现,导致“发”命令时不时地会意外地坑到我——“发”命令如果超出了创建这个命令的生命周期,我模块里面存的相当于野指针了,我就需要非常小心地留意这个问题。所以我就考虑&#

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值