如何简化C ++ 0x中lambdas的繁琐参数声明?

时间:2010-12-01 11:38:16

标签: lambda c++11

最简单的代码是最好的提问者:

#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<int> coll;
    for_each(coll.begin(), coll.end(), [](vector<int>::value_type n) -> void {});

    return 0;
}

在这里,vector<int>::value_type n很乏味。我希望有一个类似自动的实用程序来自动推导出正确的n类型;如下所示:

for_each(coll.begin(), coll.end(), [](auto_type n) -> void {});

为了更加贪婪,我希望auto_type采用一个参数来推断出正确的n类型。参数可以是(智能)指针或对容器的引用,也可以是容器的迭代器。

亲爱的大师,如何实现?

3 个答案:

答案 0 :(得分:2)

您不必在该函数中声明void返回。您可以使用decltype,例如decltype(coll[0])

std::for_each(coll.begin(), coll.end(), [](decltype(coll[0]) value) {
    std::cout << value;
});

编辑:

template<typename T> auto type(T&& t) -> decltype(*std::forward<T>(t).begin()) {
    return *t.begin();
}
std::for_each(coll.begin(), coll.end(), [](decltype(type(coll)) value) {
});

答案 1 :(得分:1)

你永远不应该写vector&lt; int&gt; :: value_type而不是int,因为你已经知道它们是相同的。一个更好的例子会有所帮助我也想要更简单的lambda参数。

但是,推导参数类型取决于lambda的使用方式,只有通过了解for_each的详细信息才能知道。但函数重载决策取决于知道参数的类型,因此参数类型不能取决于函数如何使用它,或者你有循环依赖。

在当前的C ++中,通过将函子类型与其参数类型分离来避免这种循环依赖:

struct AddExample {
  template<class T>
  T operator()(T a, T b) {
    return a + b;
  }
};

some_algo(begin, end, AddExample());

可以为lambda语法完成等价物,代价是修改一些语义(例如隐式转换为函数指针和std :: function),但我没有看到它发生在C ++ 0x上。

答案 2 :(得分:0)

lambda提案的早期版本包括提供所谓的多态lambda,其语法如下:

auto print = [](x) { std::cout << x; };
print(42);
print("foo");

不幸的是,在提案中存在技术问题,考虑到已经非常紧张的时间表,委员会认为不可能得到令人满意的解决,因此多态lambda的引入被推迟到未来的标准修订中,而不是标准化可能破坏的特征。