2016-04-21 46 views
1

我在设计中有三类基类(结构)成员。C++类成员基数和声明之间的映射是否正确?

  • 0或1
  • 0以上
  • 恰好一个

我已将他们映射到下面的声明如类(结构)的成员

class Foo { 
     ExactlyOnce exactlyOnce; 
     std::unique_ptr<ZeroOrOnce> zeroOrOnce; 
     std::list<std::shared_ptr<ZeroOrMore>> zeroOrMore; 
}; 

我打算在整个包中推广这种模式,这种方法是好的,或者它有一些错误会员基数?

回答

1

看起来不错。

考虑以下虽:使用boost::optionalZeroOrOne(如果你已经使用boost)

  • ;其背后的意图更为明确,因为API已针对此进行了优化。使用代替std::list<std::shared_ptr<T>>代替ZeroOrMore。除了大型/昂贵的对象并执行前置和随机插入的情况外,矢量往往会更有效率。

+0

'boost :: optional'看起来不错! :) – Samik

+0

同意两个,特别是'vector'。注: - '可选的'正在被集成为'std :: optional'在C++中17 –

2

对于​​3210基数按值存储元素,而不是按指针存储。如果没有别的办法,只能将指针存储为最后的手段。

+0

如果我没有移动构造函数,那会不会很慢? – Samik

+2

@Samik零值或更多值可能需要一个可选类型。但关于指针的观点非常好。另外,所有权语义是基数的一个单独问题。为什么你会将共享所有权用于零个或多个,但对一个或多个所有权具有唯一所有权? – juanchopanza

+3

@Samik它取决于,使用你最好的判断和验证与探查。此外,元素不会在'std :: list'中移动,而他们在'std :: vector'中执行。 –