Pit*_*all 6 c++ enums design-patterns c++11
我有一个枚举类如下:
enum class Age
{
Eleven,
Twelve,
Thirteen
};
Run Code Online (Sandbox Code Playgroud)
然后我有一个叫做的方法vector<Person> GetPeopleOfAge(Age age).什么是一个好的设计,以便开发人员可以打电话给这个并让11,12和13的人?我可以称它为三次,这很糟糕,但我确实想提一下我考虑过它.我可以添加一个All枚举并检查我的方法,但我不喜欢用枚举来污染枚举的想法,All只是为了使我的案例工作.我知道这是一种解决这个问题的常用方法,有些人可能不同意我的意见,但对我而言,它感觉很hacky并且正在寻找替代方案.也许我应该使用枚举以外的东西?
无论All是在enum其他机制中隐式捕获还是隐式捕获,都必须处理抽象.鉴于此,我发现明确处理它会更好.
您可以使用已建立的使用枚举值的方法,以便可以使用按位OR运算符组合它们.
enum Age : unsigned int
{
Eleven = 000001,
Twelve = 000010,
Thirteen = 000100,
All = 000111
};
Run Code Online (Sandbox Code Playgroud)
然后,你可以使用
// Get all the people of age 11
auto ret1 = GetPeopleOfAge(Age::Eleven);
// Get people of all ages
auto ret2 = GetPeopleOfAge(Age::All);
// Get all the people aged 11 or 13
auto ret3 = GetPeopleOfAge(Age::Eleven | Age::Thirteen);
Run Code Online (Sandbox Code Playgroud)
一种选择是使过滤器参数可选:
vector<Person> GetPeopleOfAge(std::optional<Age> age = {})
Run Code Online (Sandbox Code Playgroud)
然后,在函数内部,使用if (age)检查是否应该进行基于年龄的过滤。
不过,该函数可能应该重新命名,因为它并不总是给出特定年龄的人;有时,它给所有人。
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |