在C#中,您可以定义自定义枚举很平凡,如:C++ 11中的枚举器等价吗?
public IEnumerable<Foo> GetNestedFoos()
{
foreach (var child in _SomeCollection)
{
foreach (var foo in child.FooCollection)
{
yield return foo;
}
foreach (var bar in child.BarCollection)
{
foreach (var foo in bar.MoreFoos)
{
yield return foo;
}
}
}
foreach (var baz in _SomeOtherCollection)
{
foreach (var foo in baz.GetNestedFoos())
{
yield return foo;
}
}
}
(这可以通过使用LINQ和更好的封装被简化,但是这不是问题的点)
在C++ 11,你可以做类似的枚举,但据我所知它需要一个访问者模式来代替:
template<typename Action>
void VisitAllFoos(const Action& action)
{
for (auto& child : m_SomeCollection)
{
for (auto& foo : child.FooCollection)
{
action(foo);
}
for (auto& bar : child.BarCollection)
{
for (auto& foo : bar.MoreFoos)
{
action(foo);
}
}
}
for (auto& baz : m_SomeOtherCollection)
{
baz.VisitAllFoos(action);
}
}
有没有办法做更多的东西里第一,函数返回的范围可以在外部迭代而不是在内部调用访问者?
(我不通过构建std::vector<Foo>
并返回它的意思是 - 它应该是就地枚举)
我知道Boost.Range库的,我怀疑将参与在解决方案中,但我并不特别熟悉它。
我也知道可以定义自定义迭代器来做这种事情(我也怀疑可能会涉及到答案),但我正在寻找易于编写的东西,理想情况下不会更复杂比这里显示的例子和可组合的(例如_SomeOtherCollection
)。我宁愿不需要调用者使用lambdas或其他函子(因为它只是使它成为一个访问者),虽然我不介意在内部使用lambdas(如果需要的话)(但仍然倾向于避免它们),我宁愿不要求调用者使用lambda表达式或其他函数那里)。
我说我对访客模式不感兴趣。 – Miral