Есть много перегрузок std::get
, где, кроме того, каждый из них является самим шаблоном функции, поэтому компилятор не может указать, какой из них вы хотите на сайте вызова, на который вы запрашиваете адрес одного из них. Если вы настаиваете на использовании std::get
, вам нужно использовать static_cast
:
transform(mss.begin(), mss.end(), back_inserter(vs),
static_cast<const map<string, string>::key_type&
(*)(map<string, string>::value_type&)>(std::get<0>)
);
, который будет работать до тех пор, как тип в static_cast
соответствует декларации специализации Возможным шаблона функции по заданной в качестве аргумента. Кроме того, вы не пытаетесь явно указать аргументы шаблона шаблонов функций, например get<0, string, string>
и т. Д. - это то, что для механизма вывода аргументов шаблона. Мало того, что синтаксис уродливый, но могут быть другие перегрузки, добавленные в будущем, нарушающие вашу компиляцию.
Гораздо лучшей альтернативой является использование выражение в лямбда:
transform(mss.begin(), mss.end(), back_inserter(vs),
[](map<string, string>::value_type& p){ return p.first; });
или родовое лямбда-выражение (C++, 14):
transform(mss.begin(), mss.end(), back_inserter(vs),
[](auto& p){ return p.first; }); // or `return std::get<0>(p);`
или std::mem_fn
, который связывает его аргумент заданному указателю на элемент данных или функцию-член:
#include <functional>
transform(mss.begin(), mss.end(), back_inserter(vs),
mem_fn(&map<string, string>::value_type::first));
Спасибо. Я надеялся сохранить супер-сжатие 'get <0>', но ... это не должно было быть. Ну что ж. – screwnut