Использование функции для вызова функтора - PullRequest
0 голосов
/ 18 сентября 2011

У меня есть алгоритм, который вызывает несколько функций для обработки своих данных.Каждая из этих функций совместно использует и манипулирует многими одинаковыми переменными.Поэтому я стараюсь избегать набора функций, которые содержат длинный список ссылочных аргументов, поскольку я считаю, что их становится очень трудно читать, тем более что многие из этих переменных являются контейнерами STL.В результате я реализовал функтор для выполнения работы алгоритма и определил функцию-обертку для функтора, как показано ниже

class myfunctor {
private:
   ... list of shared members ...

   void A(..args..) { ..do some work on shared members.. } 
   void B(..args..) { ..do some work on shared members.. }
   void C(..args..) { ..do some work on shared members.. }

public:
   void operator()(class1& X, class2& Y) {
      A( .. );
      ..
      B( .. );
      ..
      C( .. );
      ..etc.. 
   }
};

void algorithm(class1& X, class2& Y) {
    myfunctor obj;
    obj(X, Y);
}

Мне просто интересно посмотреть, возможно, есть лучшийспособ реализации нескольких функций, которые все зависят от одних и тех же переменных, и считается ли это плохой практикой?

1 Ответ

3 голосов
/ 18 сентября 2011

С помощью множества функций, работающих с одними и теми же общими данными, рациональным выбором будет сделать их членами-функциями класса с данными в качестве данных экземпляра.

Однако «functor», возможно, не является правильным термином для вашегоbeastie.

A функтор ведет себя во многом как простой указатель на функцию: его можно свободно копировать вокруг, и, как правило, с точки зрения вызывающей стороны, кажется, не меняет состояние.В то время как ваша зверька, очевидно, не может быть свободно скопирована и, похоже, меняет состояние.Я бы сказал, что ваша зверька больше похожа на конечный автомат объект, переведенный из состояния в состояние с помощью вызовов функций.

Приветствия & hth.,

...