У меня есть набор функторов для вычисления конкретных вещей в диапазонах объектов. По сути, каждый функтор реализует operator()
:
template <typename Iterator1,
typename Iterator2> double operator()( Iterator1 it1,
Iterator2 it2 ) const
{
return( 0.0 );
}
Теперь у меня есть набор объектов, которые можно создать с помощью разных функторов. Я решил это, создав шаблон функции создателя:
template <class Functor> Foo createFoo( ... // some parameters for foo objects
Functor f = Functor() )
{
// calculate stuff for "foo" using functor "f"
}
Теперь я хочу делегировать выбор функтора пользователю моей программы, поэтому я решил создать фабрику функторов. Учитывая описательное имя функтора, я хочу создать соответствующий функтор, чтобы его можно было использовать при создании всех объектов Foo
, как указано выше.
Однако здесь я застрял: я не могу создать фабрику, которая возвращает шаблонный функтор, потому что я не могу вызвать эту функцию без кодирования точного типа функтора, который я хочу создать.
Я думал о том, чтобы сделать operator()
виртуальной функцией некоторого базового класса, то есть FunctorBase
, но я не хочу накладных расходов, связанных с вызовами виртуальных функций. Чтобы избежать упомянутых накладных расходов, я в первую очередь решил использовать шаблоны.
Я в тупике здесь и был бы признателен за некоторые комментарии.
ИЗМЕНИТЬ:
Что я собираюсь сделать (неверный код):
DistanceFunctor f = createFunctor( "Bar" ); // Create a functor from a client-supplied string
Foo createFoo( ..., // parameters for foo
f );
В комментариях также предлагалось использование виртуальных функций. Текущий дизайн функтора, как описано выше, не будет работать с виртуальными функциями, потому что компилятор не может сделать шаблоны функций виртуальными. Настройка класса функтора для использования двух типов Iterator в качестве параметров шаблона возможна, но очень неуклюжа.
ИЗМЕНИТЬ:
Функторы работают аналогично тем, которые используются в FLANN. см. пример в репозитории git . Я не вижу, как указать эти функторы по-другому.
virtual
. По крайней мере, не так, как я описал это здесь. - person Gnosophilon   schedule 08.04.2013DistanceFunctor
? Первая предоставленная вами подпись выглядит так, как будто она каким-то образом накапливает значения из диапазона объектов или чего-то подобного. Возможно, вам нужен не функтор, перебирающий диапазон, а предикат, который вы можете передать вcreateFoo
и использовать его в каком-то алгоритме, перебирающем диапазон (например,std::accumulate
). - person Arne Mertz   schedule 08.04.2013L2_simple
функтор в FLANN. - person Gnosophilon   schedule 09.04.2013