加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在boost :: any的map中插入元素并返回对它的引用

发布时间:2020-12-16 09:54:06 所属栏目:百科 来源:网络整理
导读:我有一个存储许多实体的类.我希望能够添加和删除为每个实体存储的任意(命名)属性. 我用这个地图来存储属性: std::mapstd::string,boost::any m_properties; 为了添加属性,我添加了一个MyProperty T的实例.到物业地图. myProperty的 T为我的每个m_size实体存
我有一个存储许多实体的类.我希望能够添加和删除为每个实体存储的任意(命名)属性.

我用这个地图来存储属性:

std::map<std::string,boost::any> m_properties;

为了添加属性,我添加了一个MyProperty< T>的实例.到物业地图. myProperty的< T>为我的每个m_size实体存储类型为T的属性.

template <class T>
MyProperty<T>& addProperty(const std::string& name,const T& defaultValue = T())
{
    assert(!m_properties.count(name));
    m_properties[name] = MyProperty<T>(m_size,defaultValue);
    return boost::any_cast<MyProperty<T>&>(m_properties[name]);
}

这是有效的,但对我来说,似乎很麻烦,我必须创建一个MyProperty< T>的实例,忘记它的类型,然后把它放回到下一行.

是否有更好,更直接的方法将属性插入到地图中并返回对它的引用?

我想避免尽可能多地复制MyProperty实例,因为它包含大量数据.

编辑:看起来我对问题的焦点不够清楚.我并不担心演员的表现,因为在我的用例中,我只会添加一些属性.但是,我在寻找编码风格方面的“更好”的解决方案,因为我总是试图为手头的任务找到最简单,最优雅的解决方案.

解决方法

This works,but to me it seems cumbersome that I have to create an instance of MyProperty,forget about its type,and cast it back on the next line.

如果你不想忘记类型,你不应该使用boost :: any,因为boost :: any确实只有这样:擦除接口的类型.

您可以考虑使用boost :: variant(尽管它需要另外一组设计权衡)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读