gpt4 book ai didi

c++ - 在 C++ 聚合类中实现调用多路复用的优雅方式?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:41 24 4
gpt4 key购买 nike

当多路调用多个子对象时,防止循环样板代码的优雅方法是什么?

问题举例说明:

struct Foo {
void Boo();
void Hoo();
bool IsActivated();
};

struct FooAggregator {
...
void Boo();
void Hoo();
...
std::vector<Foo> m_foos;
};

FooAggregator::Boo() {
for(size_t i=0, e=m_foos.size(); i!=e; ++i) {
if(m_foos[i].IsActivated()) {
m_foos[i].Boo();
}
}
}

FooAggregator::Hoo() {
for(size_t i=0, e=m_foos.size(); i!=e; ++i) {
if(m_foos[i].IsActivated()) {
m_foos[i].Hoo();
}
}
}

如您所见,FooAggregator 实现了与单个 Foo 相同(相似)的接口(interface),遍历所有 Foo 对象调用它们各自的成员函数。

正如您还看到的,迭代循环是完整的样板文件,对 FooAggregator 的每个成员函数重复。

从 FooAggregators 成员函数的实现中删除样板的优雅方法是什么

最佳答案

你可以使用 Boost.Bind正如@Space_C0wb0y 建议的那样。但是如果你出于某种原因不能使用它,那么你可以做这样的事情:

struct FooAggregator 
{
typedef void (Foo::*Fun)();


void Boo() { CallForEach(m_foos.begin(), m_foos.end(), &Foo::Boo); }
void Hoo() { CallForEach(m_foos.begin(), m_foos.end(), &Foo::Hoo); }

template<typename FwdIterator>
void CallForEach(FwdIterator first, FwdIterator last, Fun fun)
{
while (first != last )
{
if(first->IsActivated())
{
(first->*fun)();
}
first++;
}
}
};

或者您可以使用 std::for_each来自 <algorithm>作为:

#include <algorithm>

struct FooAggregator
{
typedef void (Foo::*Fun)();

void Boo() { std::for_each(m_foos.begin(), m_foos.end(), Call(&Foo::Boo)); }
void Hoo() { std::for_each(m_foos.begin(), m_foos.end(), Call(&Foo::Hoo)); }

struct Call
{
Fun m_fun;
Call(Fun fun) : m_fun(fun) {}
void operator()(Foo & foo)
{
if(foo.IsActivated())
{
(foo.*m_fun)();
}
}
};
};

了解 Function object理解第二个例子。


在 C++0x(即 C++11)中,它非常简单。您可以在 std::for_each 中使用 lamda作为:

#include <algorithm>

struct FooAggregator
{
void Boo()
{
std::for_each(m_foos.begin(), m_foos.end(), [](Foo &foo){ if (foo.IsActivated()) foo.Boo(); } );
}

void Hoo()
{
std::for_each(m_foos.begin(), m_foos.end(), [](Foo &foo){ if (foo.IsActivated()) foo.Hoo(); } );
}
//other code
};

关于c++ - 在 C++ 聚合类中实现调用多路复用的优雅方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6069719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com