【问题标题】:Method template as functor方法模板作为函子
【发布时间】:2019-05-06 17:21:20
【问题描述】:

我有一个容器类模板,其中包含几种不同类型的成员。我想传递一个为每个元素调用的函子。我可以用下面的代码做我想做的事:

#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() 定义结构是可行的,但我错过了定义 lambda 函数时的舒适感。有没有办法使用 lambda 函数来达到与结构相同的效果?或者至少允许我在调用方法中定义操作(这在模板中是不可能的)?

【问题讨论】:

  • std::function 不适合你吗?您可以将 lambda(以及更多)传递给此类。
  • @JesperJuhl 如果您不需要实际存储函数,则模板化参数通常是一个更好的主意。 std::function 实现了类型擦除,通常直接使用类型会更好。

标签: c++ templates lambda generic-lambda


【解决方案1】:

有没有什么方法可以使用 lambda 函数来达到与 struct 相同的效果?或者至少允许我在调用方法中定义操作(这在模板中是不可能的)?

当然。

但仅从 C++14 开始(引入通用 lambda)

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

【讨论】:

  • 谢谢!我试过了,但只使用了 C++11 编译器。
猜你喜欢
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多