Передача необоснованного имени шаблона в расширение шаблона функции - PullRequest
1 голос
/ 03 февраля 2012

У меня есть следующий код, определяющий шаблон Functor и функцию running_op, которая принимает массив, его длину и функтор для применения к списку:

  template <class Type>
  struct SumFunctor {
    Type sum;
    SumFunctor() : sum(0) {};
    Type operator()(Type next) {
      return sum += next;
    }
  };

  template <class Container, class Functor>
  inline Container running_op(Container& container, Functor functor) {
    transform(container.begin(), container.end(), container.begin(), functor);
    return container;  
  }

Это используется следующим образом:

  list<float> a({1,1,1,1});
  running_op(a, SumFunctor<float>());

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

  list<float> a({1,1,1,1});
  running_op(a, SumFunctor);

Поскольку в нем содержитсяможно найти в шаблоне running_op с помощью Container :: value_type. Я хотел бы сделать что-то следующее (что не работает) для создания экземпляра функтора соответствующего типа:Я могу передать необработанный шаблон другому шаблону для последующего создания экземпляра?Есть ли специальное ключевое слово, которое я должен использовать, кроме класса в списке параметров шаблона (шаблон не работал в этом случае)?На самом деле я просто хочу передать символ, который является именем шаблона функтора;это возможно?

1 Ответ

2 голосов
/ 03 февраля 2012

Вы можете использовать шаблоны шаблонов.

  template <template <class> class Functor, class Container>
  inline Container running_op(Container& container) {
    typedef typename Container::value_type ContainerType;
    transform(container.begin(), container.end(), container.begin(), functor<ContainerType>());
    return container;
  }


  running_op<sum_function>(a);

Если вы хотите использовать определенный синтаксис, вы можете использовать макросы, хотя я не рекомендую его.

#define running_op(a, b) running_op_<b>(a)
...