重载运算符>>用于 lambda

Overloading operator>> for lambdas

本文关键字:gt lambda 用于 运算符 重载      更新时间:2023-10-16

更新3:请前往lamdas 的超载操作员处

我想在c++11/14中为lambdas重载operator>>

这里有一个简单的代码:

#include<iostream>
#include<functional>
#include<vector>
using namespace std;
template <typename R,typename T>
void operator >> (vector<T>& v, function<R(T)> f){
    for(auto& e : v)
       f(e);
}
int main(){
   vector<int> v = { 1,2,3,4,5,6,7};
   auto l = [](int i) { cout << i*i << endl; };
   v >> function<void(int)>(l);
}

但我真正想要的是:

v >> l; //(I)
v >> [](int i) { cout << i*i << endl; }; //(II)

并去除function<F>

我从一个类似的问题中得到了一些想法。如何为C++0x中的泛函组合重载运算符?

特别是第二个答案中的这段代码为两个lambda重载了>>运算符。

#include <iostream>
template <class LAMBDA, class ARG>
auto apply(LAMBDA&& l, ARG&& arg) -> decltype(l(arg))
{
  return l(arg);
}
template <class LAMBDA1, class LAMBDA2>
class compose_class
{
public:
  LAMBDA1 l1;
  LAMBDA2 l2;
  template <class ARG>
  auto operator()(ARG&& arg) -> 
    decltype(apply(l2, apply(l1, std::forward<ARG>(arg))))
  { return apply(l2, apply(l1, std::forward<ARG>(arg))); }
  compose_class(LAMBDA1&& l1, LAMBDA2&& l2) 
    : l1(std::forward<LAMBDA1>(l1)),l2(std::forward<LAMBDA2>(l2))     {}
};
template <class LAMBDA1, class LAMBDA2>
auto operator>>(LAMBDA1&& l1, LAMBDA2&& l2) ->compose_class<LAMBDA1, LAMBDA2>
{
  return compose_class<LAMBDA1, LAMBDA2>
    (std::forward<LAMBDA1>(l1), std::forward<LAMBDA2>(l2));
}
int main()
{    
  auto l1 = [](int i) { return i + 2; };
  auto l2 = [](int i) { return i * i; };
  std::cout << (l1 >> l2)(3) << std::endl;
}

但对于我的简单示例,我仍然找不到如何重载>>运算符。

更新:实际上,我希望能够为不同的具有不同数量参数的lambda。

v >> [](int i) { } // calls the overload with one lambda argument
v >> [](int i1,int i2) { } // calls another overload with two lambda arguments

更新2:我想我没有解释我真正想要的是什么,我问了一个新的问题lambdas的运算符重载?

我已经详细解释了这个问题。

也许以下代码可以完成任务:

#include<iostream>
#include<functional>
#include<vector>
using namespace std;
template <typename R, typename T>
void operator >> (vector<T>& v, R f){
    for(auto& e : v)
       f(e);
}
int main(){
   vector<int> v = { 1,2,3,4,5,6,7};
   auto l = [](int i) { cout << i*i << endl; };
   v >> function<void(int)>(l);
   v >> l; //(I)
   v >> [](int i) { cout << i*i << endl; }; //(II)
}

更新:

[OP更新]:我实际上希望能够为不同的具有不同数量参数的lambda。

您可以使用std::bind来传递具有任意数量输入参数的不同Lambda(请参阅下面的代码(:

#include<iostream>
#include<functional>
#include<vector>
using namespace std;
template <typename T, typename F>
void operator >> (vector<T>& v, F f){
  for (auto& e : v) f(e);
}
int main(){
  using namespace std::placeholders;
  vector<int> v = { 1, 2, 3, 4, 5, 6, 7 };
  v >> std::bind([](int i, int j){ cout << i*j << " "; }, _1, 2);
  cout << endl;
  v >> std::bind(
         [](int i, double d1, double d2)
           { 
             cout << (static_cast<double>(i) * d1 / d2) << " "; 
           }, 
           _1, 2.0, 3.0);
  cout << endl;
  return 0;
}

HTH