2017-10-10 49 views
0

我有一个类,它看起来是这样的:存储任何与类的特定范围的值

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应能:

  1. 商店的类型一组量,充分保留了类型(是我可以投以足够好)
  2. 如果该对象存储的方式,使他们个人从通过的人(并因此保证不会改变的重要类)

我记得类似于与枚举一起在c中兴奋的东西,但我不知道名称。另外C++可能有更好的方法。

Storage_component应该是:

  1. 存储任何类型的
  2. (可选)记得原来类型

我不知道如何正确地做到这一点。我看到std :: any,但它似乎是相当新的,因此我不知道它是否是一个很好的方法来解决这个问题。此外,我不能使storage_component模板,因为我不能将它存储在一个向量中然后

什么是(适当)的方式来实现这些类?

+1

如果您的编译器和库不是最新版本的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))。或者,也许检查你的需求分析,并确保设计不需要类型擦除?也许这可以通过其他方式解决? –

+0

@Someprogrammerdude为什么人们使用boost :: btw?我到处看到它?仅仅是因为它包含了所有的std ::函数,还是因为它实际上更好/更快?这里发生了什么? 也是,谢谢。我发现std :: any实现的外部资源似乎工作正常。我不认为不适合下载增强功能 – MoustacheSpy

+1

目前标准库中的某些功能,或将在未来版本的标准库中提供的功能,起始于Boost库。例如Boost any。如果你没有足够新的编译器用于'std :: any',那么Boost any是一个合适的替代品。 [Boost](http://www.boost.org/)不是一个单独的库,它是许多库的一个*集合*。有些在标准库中复制行为(或者往往是相反的方式),但它也有很多*更多。 –

回答

0

商店的类型一组量,充分保留了类型

你可能想std::variant<Ts...>(或boost::variant<Ts...>。它在特定时间点存储Ts...之一。


存储任何类型的

如果所有类型相同的接口,使用传统的virtual + std::unique_ptr多态性的方法。否则std::any在这里是正确的选择。

+0

谢谢你的伟大答案!对于存储id喜欢使用任何类型(包括int,char等),所以我想他们不会使用相同的接口。 std :: any是否会自动创建传递的类的副本,或者这是我必须手动执行的操作吗?我有同样的问题关于std :: variant – MoustacheSpy

+0

'std :: variant'和'std :: any'都是值语义类型 - 它们会为您复制当前活动的类型。 –

+0

@MoustacheSpy:我添加了一些链接到答案,检查出来的更多信息。 –