我有一个存储许多实体的类.我希望能够添加和删除为每个实体存储的任意(命名)属性.
我用这个地图来存储属性:
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(尽管它需要另外一组设计权衡)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。