使用std :: function调用对象列表上的任何对象成员函数

问题描述 投票:0回答:2

我有一个对象列表,我需要调用一个成员函数 - 到目前为止没什么大不了的:迭代列表,完成调用。

现在我有几个在同一个列表上几乎相同的地方,除了被调用的成员函数改变(参数总是相同,一个double值)。

我尝试了一下std :: function,但最终还是无法运行。有什么建议? (经过多年的C#,我回到了C ++,所以忘记了很多)。

这就是它现在的样子:

void CMyService::DoSomeListThingy(double myValue)
{
    for (std::list<CMyListItem*>::iterator v_Iter = myList.begin(); v_Iter != myList.end(); ++v_Iter)
    {
        (*v_Iter)->MethodToBeCalled(myValue);
    }
}

void CMyService::DoSomeThingDifferent(double myValue)
{
    for (std::list<CMyListItem*>::iterator v_Iter = myList.begin(); v_Iter != myList.end(); ++v_Iter)
    {
        (*v_Iter)->CallTheOtherMethod(myValue);
    }
}

这就是我喜欢它的方式:

void CMyService::DoSomeListThingy(double myValue)
{
    ApplyToList(&CMyListItem::MethodToBeCalled, myValue);
}

void CMyService::DoSomeThingDifferent(double myValue)
{
    ApplyToList(&CMyListItem::CallTheOtherMethod, myValue);
}

void CMyService::ApplyToList(std::function<void(double)> func, double myValue)
{
    for (std::list<CMyListItem*>::iterator v_Iter = myList.begin(); v_Iter != myList.end(); ++v_Iter)
    {
        (*v_Iter)->func(myValue);
    }
}
c++ c++11 std-function stdbind
2个回答
3
投票
void CMyService::ApplyToList(void (CMyListItem::*func)(double), double myValue) {
    for (auto p : myList) {
        (p->*func)(myValue);
    }
}

使用pre-C ++ 11编译器:

void CMyService::ApplyToList(void (CMyListItem::*func)(double), double myValue) {
  for (std::list<CMyListItem*>::iterator v_Iter = myList.begin();
       v_Iter != myList.end(); ++v_Iter) {
    ((*v_Iter)->*func)(myValue);
  }
}

0
投票

你可以使用lambdas

void CMyService::ApplyToList(std::function<void(CMyListItem*, double)> func, double myValue))
{
    for (std::list<CMyListItem*>::iterator v_Iter = myList.begin(); v_Iter != myList.end(); ++v_Iter)
    {
        func(*v_Iter, myValue);
    }
}

double val;
std::function<void(A*,double)> fun1 = [=](A *th,double) {
                                                  th->foo(val);
                                                 };

std::function<void(A*,double)> fun2 = [=](A *th,double) {
                                                  th->bar(val);
                                                 };
ApplyToList(fun1, val);
ApplyToList(fun2, val);
© www.soinside.com 2019 - 2024. All rights reserved.