参数类型自动扣除和匿名lambda函数

时间:2011-04-19 07:10:41

标签: c++ lambda c++11

假设我有这些代码行;

std::vector<int> ints;
std::for_each(ints.begin(), ints.end(), [](int& val){ val = 7; });

但是,我不想在我的lambda函数中指定参数类型,即我想写这样的东西;

std::for_each(ints.begin(), ints.end(), [](auto& val){ val = 7; });

无论如何这可以实现吗?

(boost :: lambda不需要指定类型......)


更新

现在我使用宏:#define _A(container) decltype(*std::begin(container))所以我可以这样做:

std::for_each(ints.begin(), ints.end(), [](_A(ints)& val){ val = 7; });

4 个答案:

答案 0 :(得分:29)

没有。 “多态lambdas”是C ++委员会讨论期间提到的这个特性,并没有标准化。必须指定lambda的参数类型。

您可以使用decltype

std::for_each(ints.begin(), ints.end(), [](decltype(*ints.begin())& val){ val = 7; });

答案 1 :(得分:13)

您的首选语法在C ++ 14中是合法的,并且被称为通用lambda或多态lambda。

http://isocpp.org/blog/2013/04/n3649-generic-polymorphic-lambda-expressions-r3

auto lambda = [](auto x) { return x; };
lambda(5);
lambda("hello");
lambda(std::vector<int>({5, 4, 3}));

我想现在的问题是,为什么我们不能将此语法用于常规函数?

auto&amp;&amp; f(auto&amp;&amp; x){return x; }

答案 2 :(得分:3)

如果您有容器,可以尝试这样的

template<typename Container>
void reset(Container c)
{
   for_each(c.begin(),c.end(),[](typename Container::reference val) { val=7; });
}

答案 3 :(得分:0)

试试这个:

#include <functional>
#include <algorithm>
#include <iostream>

template <typename ValTy>
std::function<void(ValTy&)> polymorphicLambda ()
{
    return std::function<void(ValTy&)> ([](ValTy& val) -> void { val = 7; } );
}

int main()
{
    std::vector<int> ints(5);

    std::generate_n(ints.begin(), 5, []() { return 0; });
    std::for_each(ints.begin(), ints.end(), [](int& val) { std::cout << val << "\t"; });
    std::cout << std::endl;

    std::for_each(ints.begin(), ints.end(), polymorphicLambda<int>());
    std::for_each(ints.begin(), ints.end(), [](int& val) { std::cout << val << "\t"; });
    std::cout << std::endl;


    std::vector<double> doubles(5);

    std::generate_n(doubles.begin(), 5, []() { return 0; });
    std::for_each(doubles.begin(), doubles.end(), [](double& val) { std::cout << val << "\t"; });
    std::cout << std::endl;

    std::for_each(doubles.begin(), doubles.end(), polymorphicLambda<double>());
    std::for_each(doubles.begin(), doubles.end(), [](double& val) { std::cout.precision(2); std::cout << std::fixed << val << "\t"; });
    std::cout << std::endl;

    return 0;
}

您也可以使用不返回void的lambda来做一些时髦的东西,并使用可变参数模板将多个参数传递给lambda。