Почему плохо иметь местный функтор? - PullRequest
7 голосов
/ 03 января 2011

Например, что не так с объявлением удвоителя класса в основной функции, если предикат будет использоваться только один раз?

#include <list>
#include <algorithm>
#define SIZE 10
int main()
{
    std::list<int> myList;
    for(int i=0; i<SIZE ;++i)
    {
        myList.push_back(i);
    }

    class doubler
    {
    public:
        doubler(){}
        int operator()(int a)
        {
            return a + a;
        }

    } pred;

    std::for_each(myList.begin(), myList.end(), pred);
    return 0;
}

Ответы [ 2 ]

14 голосов
/ 03 января 2011

Проблема с этой настройкой заключается в том, что, по крайней мере в C ++ 03, вы не можете использовать локальный функтор в качестве аргумента шаблона, потому что он не имеет внешней связи.Это означает, что с технической точки зрения приведенный выше код не является законным.Тем не менее, они исправляют это в C ++ 0x, поскольку это довольно глупое ограничение, и поскольку VS2010 имеет элементарную поддержку C ++ 0x, приведенный выше код вполне подходит.

Короче говоря, ответ на ваш вопросв том, что в этом нет ничего плохого, если вы используете компиляторы, совместимые с C ++ 0x, но в противном случае вам, вероятно, следует воздерживаться от этого, чтобы максимизировать кросс-компиляторную совместимость.

5 голосов
/ 03 января 2011
  • Это недопустимо до C ++ 0x
  • В C ++ 0x есть лучшее решение (лямбды / замыкания)

Так что в любом случае выследует использовать другое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...