Как упростить объявление утомительного параметра лямбда-выражений в C ++ 0x? - PullRequest
2 голосов
/ 01 декабря 2010

Самый простой код - лучший запрос:

#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 ]

2 голосов
/ 01 декабря 2010

Вам не нужно объявлять возврат 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 голос
/ 01 декабря 2010

Вы никогда не должны писать vector :: value_type вместо int, поскольку вы уже знаете, что они идентичны. Лучший пример поможет; Я также хотел бы более простые параметры лямбда.

Однако тип выводимого параметра зависит от того, как используется лямбда, и это можно узнать, только зная подробности for_each. Но разрешение перегрузки функции зависит от знания типов параметров, поэтому тип параметра не может зависеть от того, как функция его использует, иначе у вас будет циклическая зависимость.

В текущем C ++ вы избегаете этой циклической зависимости, отделяя тип функтора от его типов параметров:

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

some_algo(begin, end, AddExample());

Эквивалент может быть сделан для лямбда-синтаксиса, за счет использования некоторой семантики (например, неявного преобразования в указатели на функции и std :: function), но я не вижу, чтобы это происходило для C ++ 0x. *

0 голосов
/ 01 декабря 2010

В ранних версиях лямбда-предложения содержалось положение о так называемых полиморфных лямбдах с простым синтаксисом:

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

К сожалению, в предложении были технические вопросы, которые, по мнению комитета, не могли быть удовлетворительно решены с учетом и без того очень плотного графика, поэтому вместо стандартизации возможно нарушенной функции введение полиморфных лямбд откладывалось до будущего пересмотра стандарта. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...