c++ - 如何重载带有各种参数的lambda函数?

标签 c++ c++14

我正在使用建议的解决方案in this answer从lambda函数获取参数,并且在参数数量固定的情况下可以正常工作。我首先创建了一个带有一个参数的变体,并想添加第二个接受两个参数的变体。我不希望将其概括,只是下面的两个选项。

class MyClass {
  template<typename Lambda>
  typename std::enable_if<function_traits<Lambda>::arity, 1>>
  void Each(Lambda lambda) {
    using Traits = function_traits<decltype(lambda)>;
    using Arg0 = typename Traits::template arg<0>::type;
    lambda(Conv<Arg0>().ToType(this));
  }

  template<typename Lambda>
  typename std::enable_if<function_traits<Lambda>::arity, 2>>
  void Each(Lambda lambda) {
    using Traits = function_traits<decltype(lambda)>;
    using Arg0 = typename Traits::template arg<0>::type;
    using Arg1 = typename Traits::template arg<1>::type;
    lambda(Conv<Arg0>().ToType(this), Conv<Arg1>().ToType(this));
  }
}

void main() {
  MyClass myClass;
  myClass.Each([](int arg) {});
  myClass.Each([](int arg0, int arg1) {});
}

这段代码当然根本不会编译,但是我仍然不明白enable_if的工作原理。我正在使用GCC 6.2.0,因此不能使用C++ 17功能(如constexpr),否则我会使用它。正确的实现在这里看起来像什么?

最佳答案

假设已定义Conv


class MyClass {
  public:

  template<typename Lambda>
  typename std::enable_if<(function_traits<Lambda>::arity == 1), void>::type
  Each(Lambda lambda) {
    using Traits = function_traits<decltype(lambda)>;
    using Arg0 = typename Traits::template arg<0>::type;
    lambda(Conv<Arg0>().ToType(this));
  }

  template<typename Lambda>
  typename std::enable_if<(function_traits<Lambda>::arity == 2), void>::type
  Each(Lambda lambda) {
    using Traits = function_traits<decltype(lambda)>;
    using Arg0 = typename Traits::template arg<0>::type;
    using Arg1 = typename Traits::template arg<1>::type;
    lambda(Conv<Arg0>().ToType(this), Conv<Arg1>().ToType(this));
  }
};

int main() {
  MyClass myClass;
  myClass.Each([](int arg) {});
  myClass.Each([](int arg0, int arg1) {});
  return 0;
}

关于c++ - 如何重载带有各种参数的lambda函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59597443/

相关文章:

c++ - 如何以简洁的方式安全地访问容器中的每个第 n 个元素?

c++ - boost::interprocess::map 插入给出:对重载函数的模糊调用

具有非静态成员初始化器的类的 C++11 聚合初始化

c++ - 将 unique_ptrs 从 map 插入 vector 时出错

c++ - 检索不同类型的对象指针

c++ - 函数的参数顺序

c++ - AWS 签名版本 4 发生了什么变化

C++ 判断一个容器是否有::find()

c++ - `if constexpr` 的 issue with non-placement new

c++ - 仅在 constexpr 函数体内的未计算上下文中使用的参数