最简单的代码是最好的提问者:
#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类型。参数可以是(智能)指针或对容器的引用,也可以是容器的迭代器。
亲爱的大师,如何实现?
答案 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的引入被推迟到未来的标准修订中,而不是标准化可能破坏的特征。