【发布时间】:2014-11-01 11:25:30
【问题描述】:
我有一个存储许多实体的类。我希望能够添加和删除为每个实体存储的任意(命名)属性。
我使用这张地图来存储属性:
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 实例,因为它包含大量数据。
编辑:看来我对问题的重点还不够清楚。我不担心演员表的性能,因为在我的用例中,我只会添加少数属性。但是,我一直在寻找编码风格方面“更好”的解决方案,因为我一直在努力为手头的任务找到最简单、最优雅的解决方案。
【问题讨论】:
-
@Niall 并不总是插入。此外,它具有相同的演员要求