我们可以使用模板和工作来处理Lambda表达式吗?异常处理?
任何人都可以在exapmle计划中表明吗?
是否可以使用模板和表达来表达lambda表达式/函数。异常处理?
编辑:我需要一个示例程序..“使用模板和异常处理的Lambda Expression / Functyions”答案 0 :(得分:3)
您可以将lambda传递给模板。最简单的例子是std::for_each
:
std::vector<int> v;
for(int i=0;i<10;++i)
{
v.push_back(i);
}
std::for_each(v.begin(),v.end(),[](int& i){i*=2;}); // double each value
std::for_each(v.begin(),v.end(),[](int i){std::cout<<i<<std::endl;}); // print each value
这将打印
0
2
4
6
8
10
12
14
16
18
您也可以从lambda中抛出异常,并在外部捕获它们。 e.g。
try
{
unsigned count=0;
std::for_each(
v.begin(),v.end(),
[&count](int i)
{
if(++count==5)
{
throw i;
}
std::cout<<i<<std::endl;
});
}
catch(int i)
{
std::cout<<"Caught "<<i<<std::endl;
}
使用之前的v
,然后将打印
0
2
4
6
Caught 8
你不能拥有模板化的lambda,但你可以在模板中使用lambda:
template<typename T>
void f(std::vector<T> const& v)
{
std::for_each(
v.begin(),v.end(),
[](T const& t){std::cout<<t<<std::endl;}); // print each value
}
答案 1 :(得分:0)
你不能直接模板化lambda,但也许你可以创建一个模板化的lambda工厂:
#include <functional>
template <typename T>
struct make_adder
{
static inline std::function<T(T,T)> create()
{
return [](T a, T b){ return a + b; };
}
};
甚至:
template <typename T> std::function<T(T,T)> make_adder
{
return [](T a, T b){ return a + b; };
}
然后你可以创建几个实例:
auto int_adder = make_adder<int>::create();
auto black_adder = make_adder<Black>::create();
不确定是否需要以这种方式创建lambdas,但如果你发现了,那么可以通过这样的包装来实现模板化。