存储任何与类的特定范围的值
我有一个类,它看起来是这样的:存储任何与类的特定范围的值
class container{
private:
std::vector<physical_component> physical;
std::vector<storage_component> storage;
--some other stuff not relevant--
public:
--constructors, getters setters, methods to add to the vectors etc--
}
现在我与制作physical_component和storage_component类struggeling,因为我不知道正确的数据类型来处理这类事情。
Physical_component应能:
- 商店的类型一组量,充分保留了类型(是我可以投以足够好)
- 如果该对象存储的方式,使他们个人从通过的人(并因此保证不会改变的重要类)
我记得类似于与枚举一起在c中兴奋的东西,但我不知道名称。另外C++可能有更好的方法。
Storage_component应该是:
- 存储任何类型的
- (可选)记得原来类型
我不知道如何正确地做到这一点。我看到std :: any,但它似乎是相当新的,因此我不知道它是否是一个很好的方法来解决这个问题。此外,我不能使storage_component模板,因为我不能将它存储在一个向量中然后
什么是(适当)的方式来实现这些类?
商店的类型一组量,充分保留了类型
你可能想std::variant<Ts...>
(或boost::variant<Ts...>
)。它在特定时间点存储Ts...
之一。
存储任何类型的
如果所有类型相同的接口,使用传统的virtual
+ std::unique_ptr
多态性的方法。否则std::any
在这里是正确的选择。
谢谢你的伟大答案!对于存储id喜欢使用任何类型(包括int,char等),所以我想他们不会使用相同的接口。 std :: any是否会自动创建传递的类的副本,或者这是我必须手动执行的操作吗?我有同样的问题关于std :: variant – MoustacheSpy
'std :: variant'和'std :: any'都是值语义类型 - 它们会为您复制当前活动的类型。 –
@MoustacheSpy:我添加了一些链接到答案,检查出来的更多信息。 –
如果您的编译器和库不是最新版本的C++ 17(引入了['std :: any'](http://en.cppreference.com/w/cpp/utility/any))那么也许[Boost any](http://www.boost.org/doc/libs/1_65_1/doc/html/any.html)?或者['std :: variant'](http://en.cppreference.com/w/cpp/utility/variant)(或者[Boost equivalent](http://www.boost.org/doc/libs) /1_65_1/doc/html/variant.html))。或者,也许检查你的需求分析,并确保设计不需要类型擦除?也许这可以通过其他方式解决? –
@Someprogrammerdude为什么人们使用boost :: btw?我到处看到它?仅仅是因为它包含了所有的std ::函数,还是因为它实际上更好/更快?这里发生了什么? 也是,谢谢。我发现std :: any实现的外部资源似乎工作正常。我不认为不适合下载增强功能 – MoustacheSpy
目前标准库中的某些功能,或将在未来版本的标准库中提供的功能,起始于Boost库。例如Boost any。如果你没有足够新的编译器用于'std :: any',那么Boost any是一个合适的替代品。 [Boost](http://www.boost.org/)不是一个单独的库,它是许多库的一个*集合*。有些在标准库中复制行为(或者往往是相反的方式),但它也有很多*更多。 –