是否可以使用模板和表达来表达lambda表达式/函数。异常处理?

时间:2011-07-13 05:41:29

标签: c++ c++11 lambda

我们可以使用模板和工作来处理Lambda表达式吗?异常处理?

任何人都可以在exapmle计划中表明吗?

是否可以使用模板和表达来表达lambda表达式/函数。异常处理?

编辑:我需要一个示例程序..“使用模板和异常处理的Lambda Expression / Functyions”

2 个答案:

答案 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,但如果你发现了,那么可以通过这样的包装来实现模板化。