【问题标题】:Problem with template and lambda C++0x模板和 lambda C++0x 的问题
【发布时间】:2011-04-13 09:26:15
【问题描述】:
#include <iostream>
#include <algorithm>
#include <array>

using namespace std;

template<class T>
void func(T beg, T end)
{
    typedef decltype(*beg) type;
    std::for_each(beg, end, [](type t) { cout << t << endl; });
}

int main()
{
    std::array<int, 4> arr = { 1,2,3,4 };
    func(arr.begin(), arr.end());

    return 0;
} 

decltype 告诉 lambda 表达式要使用什么类型时要走的路吗?

【问题讨论】:

  • 您遇到的错误是什么。这里运行良好:ideone.com/zI3iL
  • 它没有错误,我只是想知道当使用带有模板的 lambda 时,decltype 是告诉 lambda 模板类型的唯一方法,是正确的编码方式吗?

标签: c++ templates c++11 lambda


【解决方案1】:

这可能可以接受,但是由于您的代码似乎只需要迭代器,我认为以下内容会更合适:

typedef typename std::iterator_traits<T>::value_type type;

甚至更好(考虑到您的使用方式):

typedef typename std::add_reference<
    typename std::add_const<
        typename std::iterator_traits<T>::value_type
    >::type
>::type type;

【讨论】:

  • 非常更喜欢 OP 的做法。
  • @AndresJaanTack : 公平的声明——考虑到我最初回答这个问题已经一年半了,我对 C++11 习语的适应程度已经发展到足以在这一点上我可能会使用 OP 的方法以及。 :-] 话虽如此,我仍然对 OP 关于返回代理对象的迭代器的方法存在一些挥之不去的担忧(例如 std::vector&lt;bool&gt;::iterator),尽管我不知道这些担忧是否真的有根据。
猜你喜欢
  • 2011-02-03
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
相关资源
最近更新 更多