Lambda 如何简化C++;0x?

Lambda 如何简化C++;0x?,lambda,c++11,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; } 为了更加贪婪,我希望

最简单的代码就是最好的询问者:

#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;
}
为了更加贪婪,我希望auto_type接受一个参数,用于推导n的正确类型。参数可以是容器的(智能)指针或引用,也可以是容器的迭代器


亲爱的大师,如何实现它?

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

std::for_each(coll.begin(),coll.end(),[](decltype(coll[0])值){
std::cout decltype(*std::forward(t).begin()){
返回*t.begin();
}
std::for_each(coll.begin()、coll.end()、[](decltype(type(coll))值){
});

您永远不应该编写vector::value\u type而不是int,因为您已经知道它们是相同的。一个更好的示例会有所帮助;我还希望使用更简单的lambda参数

但是,推断参数类型取决于lambda的使用方式,而这只能通过了解for_的详细信息来了解。但是函数重载解析取决于了解参数的类型,因此参数类型不能取决于函数如何使用它,否则您将具有循环依赖性

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

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

some_algo(begin, end, AddExample());
struct AddExample{
模板
T运算符()(T a,T b){
返回a+b;
}
};
一些算法(begin,end,AddExample());

lambda语法也可以做同样的事情,代价是使用一些语义(例如隐式转换为函数指针和std::function),但我看不到C++0x会发生这种情况。

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

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

auto-print=[](x){std::cout如果容器不是向量式的,则decltype(coll[0])无效。此解决方案不太通用。decltype(*coll.begin())太难看了。有时,我们只为每个(前,后,[](??value)->void{})保存一个迭代器;在这种情况下,auto_类型如何?@xmllmx:您可以为coll.begin()编写一个简单的帮助程序。在这种情况下,编写某种auto_类型的问题在于您无法为lambda或其运算符()创建模板,因此我非常怀疑您是否能在这里得到一般性的答案。
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) {
});
struct AddExample {
  template<class T>
  T operator()(T a, T b) {
    return a + b;
  }
};

some_algo(begin, end, AddExample());
auto print = [](x) { std::cout << x; };
print(42);
print("foo");