Как вызывать конструкторы функторов C ++ при использовании for_each или std :: transform - PullRequest
3 голосов
/ 20 июля 2011

Я никогда раньше не использовал функторы с ++, поэтому просто пытаюсь понять, как они работают.

например. предположим, у нас есть этот класс функторов

class MultiplyBy {
private:
    int factor;

public:
    MultiplyBy(int x) : factor(x) { }

    int operator () (int other) const {
        return factor * other;
    }
};

Использовать его так, как мне ясно:

MultiplyBy mult_3(3);

int x = mult_3(100);

Очевидно, конструктор MultiplyBy вызывается с аргументом 3.

Но как в следующем случае вызывается конструктор со значением в массиве?

int array[5] = {1, 2, 3, 4, 5};
std::transform(array, array + 5, array, MultiplyBy(3));

Ответы [ 3 ]

3 голосов
/ 20 июля 2011

Вы можете думать, что преобразование структурировано так:

void transform(Iterator b, Iterator e, Functor f)
{
    for(;b != e; ++b)
    {
        *b = f(*b);
    }
}

Функтор передается по значению в функцию.
Поэтому, когда вы звоните так:

std::transform(array, array + 5, array, MultiplyBy(3));

Здесь вы создали временный объект. Это передается как значение параметра в Transfer (). Это приводит к тому, что функтор копируется в функцию (это не проблема, поскольку он имеет только член POD, а конструктор копирования, сгенерированный компилятором, работает отлично). Затем параметр можно использовать в обычном режиме.

Примечание: временный объект уничтожается в конце выражения, в котором он был создан (что будет после возврата transform ()).

3 голосов
/ 20 июля 2011

Ну, в последнем случае вы создаете новый объект MultiplyBy с 3 в качестве аргумента конструктора.Этот объект затем передается в std::transform, который затем вызывает operator() on.

Если это поможет вам лучше понять, это идентично:

int array[] = {1, 2, 3, 4, 5};
MultiplyBy times3(3);
std::transform(array, array + 5, array, times3);
1 голос
/ 20 июля 2011

MultiplyBy(3) создает неназванную временную переменную, которая передается в transform и (в этой точке) получает соответствующее имя параметра в этой функции.

...