重载运算符>>用于 lambda
Overloading operator>> for lambdas
更新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
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- EASTL矢量<向量<int>>连续的
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝
- 捕获lambda中的std::数组
- 这 4 个 lambda 表达式之间有什么区别?
- 在实现文件中使用头文件的通用 lambda