C++ 是否可以使用模板和异常处理来表达lambda表达式/函数?
我们可以用模板和异常处理来处理Lambda表达式吗 有谁能在考试项目中证明这一点吗 是否可以使用模板和异常处理来表达lambda表达式/函数C++ 是否可以使用模板和异常处理来表达lambda表达式/函数?,c++,c++11,lambda,C++,C++11,Lambda,我们可以用模板和异常处理来处理Lambda表达式吗 有谁能在考试项目中证明这一点吗 是否可以使用模板和异常处理来表达lambda表达式/函数 编辑:我需要一个示例程序..Lambda表达式/函数使用模板和异常处理您可以将Lambda传递给模板。最简单的例子是std::for_each: 您还可以从lambda抛出异常,并在外部捕获它们。e、 g try { unsigned count=0; std::for_each( v.begin(),v.end(),
编辑:我需要一个示例程序..Lambda表达式/函数使用模板和异常处理您可以将Lambda传递给模板。最简单的例子是std::for_each: 您还可以从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;
}
不能有模板化的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
}
您不能直接为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();
不确定是否需要以这种方式创建lambda,但如果您发现需要,则可以通过这样的包装器实现模板化。lambda的工作方式与调用任何其他functor一样,因此它们在异常情况下也能按预期工作。你不能有一个模板lambda,尽管你可以将lambda作为模板参数传递。@Cory:是的,在23点中,他给出了一个模板示例。但对我来说……我觉得……这还不够理解。。你能解释一些简单的例子吗…@用户:对我来说,你问的完全不清楚。你能提供一个具体的例子来说明你想做什么吗?@user751747:他是谁,23点是什么?Phresnel,科丽:在N32 90草案中,ISO C++标准,节:5.1.2,点23,例子是模板,有没有一个特殊的理由来创建一个静态模板,而不是模板化的全局函数?约定?@mmonny:呃。。。没有理由,我只是在思考结构模式。是的,一个函数就足够了!让我来编辑。
#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();