Шаблон метода как функтор - PullRequest
2 голосов
/ 06 мая 2019

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

#include <iostream>

template <typename T1, typename T2>
class MyContainer
{
public:
  template <typename Op>
  void run_operation(Op op)
  {
    op(t1);
    op(t2);
  }

  T1 t1;
  T2 t2;


};

struct OutputOperation
{
  template <typename T>
  void operator()(T t)
  {
    std::cout << "value is " << t << std::endl;
  }
};

int main() {
  MyContainer<int, double> container;
  OutputOperation out_op;
  container.run_operation(out_op);

}

Хотя определение структур с помощью шаблона operator() работает, мне не хватает комфорта, который мы имеем при определении лямбда-функции.Есть ли способ использовать лямбда-функции для достижения того же эффекта, что и в структуре?Или хотя бы то, что позволяет мне определить операцию внутри вызывающего метода (что невозможно с шаблонами)?

1 Ответ

6 голосов
/ 06 мая 2019

Есть ли способ использовать лямбда-функции для достижения того же эффекта, что и в структуре?Или хотя бы то, что позволяет мне определить операцию внутри вызывающего метода (что невозможно с шаблонами)?

Конечно.

Но только начиная с C ++ 14 (которые вводят общие лямбды)

  container.run_operation(
     [](auto t){ std::cout << "value is " << t << std::endl; });
...