Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以使用模板和异常处理来表达lambda表达式/函数?_C++_C++11_Lambda - Fatal编程技术网

C++ 是否可以使用模板和异常处理来表达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表达式/函数


编辑:我需要一个示例程序..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();