2016-03-02 2 views
0

Есть причину, почему я не могу передать функтор сравнения к map в качестве аргумента конструктора:карты Сравнение Constructor Параметр

map<int, string, greater<int>> foo; 
//map<int, string> foo(greater<int>()); Doesn't work 

Или почему я не могу передать лямбду без предоставления своего собственного типа сравнения:

map<int, string, function<bool(const int&, const int&)>> bar([](const int& lhs, const int& rhs){ return lhs > rhs; }); 
//map<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; }); Doesn't work 

Я хотел бы просто объявить map<int, string> и построить его с помощью компаратора. Почему я не могу?

[Live Example]

+0

Потому что это будет связано с некоторыми типами стирания, что не является оптимальным? –

+0

Возможный дубликат: [Почему бы не вывести шаблонный параметр из конструктора?] (Http://stackoverflow.com/questions/984394/why-not-infer-template-parameter-from-constructor) – NathanOliver

+0

@PiotrSkotnicki Вы говорите, что для версия-функтор? Но не «сопоставляет» конструктор сравнения? http://www.cplusplus.com/reference/map/map/map/ Разве это не так? –

ответ

1

Этот вопрос проистекает из неправильного представления. Чтобы очистить, что до:

функторы являются объектами не функции

Попытка присвоить указатель на функцию или лямбда на объект не имеет никакого смысла. Так что это не может быть сделано: map<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; }); Пути к определить map, которая принимает указатель на функцию или лямбда использовать аргументы шаблона от вопроса: map<int, string, function<bool(const int&, const int&)>>

На полпути между двумя непродуманными вариантами в вопросе является еще заблуждение: map<int, string, [](const int& lhs, const int& rhs){ return lhs > rhs; }> не работает, так как шаблон компаратора аргумент является типа члена map, не значение intialization. Так map используя указатель на функцию или лямбда-компаратор должен всегда иметь это значение, передаваемое в map конструктор: map<int, string, function<bool(const int&, const int&)>> bar([](const int& lhs, const int& rhs){ return lhs > rhs; }) В противном случае function<bool(const int&, const int&)>() будет использоваться для сравнения в map.

Это, вероятно, уже ясно, но поскольку функторы являются объектами, которые нельзя передать несвязанным объектом, это значение конструкции совершенно другого типа объекта. Вызов map<int, string> foo(greater<int>()) это как позвонить less<int> foo = greater<int> . Единственный допустимый аргумент конструктора-компилятора для map, аргумент шаблона-компаратора которого является функтором, является тем, что может быть преобразовано в объект типа функтора в аргументе шаблона: map<int, string, greater<int>> foo(greater<int>{}) Это, очевидно, не нужно, поскольку если аргументы не были предоставлены, а greater<int> был построен по умолчанию, будет получена такая же инициализация члена map, поэтому map<int, string, greater<int>> является достаточным.

+1

'map > foo (больше ())' является объявлением функции (самый неприятный синтаксический разбор) –

+0

@PiotrSkotnicki Ugh, спасибо. Очевидно, я не пробовал этого, потому что это бесполезно. Я редактировал и фактически тестировал, что он работает сейчас: http://ideone.com/1Ygrze –

 Смежные вопросы

  • Нет связанных вопросов^_^