метод класса в for_each - PullRequest
       3

метод класса в for_each

1 голос
/ 06 октября 2011

Существует класс и структура событий:

struct Foo
{
    Foo(): name("nx"), val(9) {}
    string name;
    int val;
};

class Base
{
    public:
        Base()
        {
            /*array.push_back(Foo());
            array.push_back(Foo());
            array.push_back(Foo());             //fill array Foo
            array.push_back(Foo());
            array.push_back(Foo());*/
        }
        void Define(Foo* desktop)
        {
            cout << desktop->name << " " << desktop->val << "\n";
        }

        void Oblem()
        {
            /*for(int i = 0; i < array.size(); ++i)
            {
                Define(&array[i]);
            }*/
            for_each(array.begin(), array.end(), mem_fun_ref(&Base::Define));
        }
    public:
        std::vector<Foo> array;
};

как заменить закомментированный цикл в алгоритме for_each?

У меня теперь есть следующие ошибки:

  1. ошибка: нет совпадения для вызова '(std :: mem_fun1_ref_t) (Foo &)' |
  2. кандидатами являются: _Ret std :: mem_fun1_ref_t <_Ret, _Tp, _Arg> :: operator ()(_Tp &, _Arg) const [с _Ret = void, _Tp = Base, _Arg = Foo *] |

Ответы [ 2 ]

2 голосов
/ 06 октября 2011
class Base
{
public:
    Base() : array(5) {}


    void Define(Foo &desktop)
    {
        cout << desktop.name << " " << desktop.val << "\n";
    }

    void Oblem()
    {
        for_each(array.begin(),array.end(),[this](Foo &f) {
            Define(f);
        });

        // or

        for_each(array.begin(),array.end(),
          bind(&Base::Define,this,placeholders::_1));
    }

public:
    std::vector<Foo> array;
};
2 голосов
/ 06 октября 2011

Base::Define принимает два аргумента: Foo* desktop и неявный Base* this.Вам нужно будет связать текущий this в пределах Oblem, чтобы получить функцию, которая принимает только Foo.Кроме того, Define должен принимать свой параметр как Foo& desktop (или еще лучше, если это реальный код, Foo const& desktop).

Полное решение, использующее стандартные функциональные возможности в TR1 (или реализацию Boost).за это) будет:

void Define(Foo const& desktop) const
{
    cout << desktop.name << " " << desktop.val << "\n";
}

void Oblem() const
{
    for_each(
        array.begin(), array.end()
      , std::bind( &Base::Define, this, _1 )
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...