Вы можете сделать что-то подобное, когда тип карты выводится из функции, которую вы передаете функции.
#include <map>
template<class Key, class Value, class F>
std::map<Key, Value, F> make_map(const F& f) {
return std::map<Key, Value, F>{f};
}
int main() {
auto my_map = make_map<int, int>([](const int&a, const int& b) { return a < b; });
my_map[10] = 20;
}
Я не вижу смысла в этом, но я не скажу, что это бесполезно. Как правило, вам нужен известный компаратор, чтобы легко переносить карту. При настройке выше вас сводится к использованию функции шаблона все время как следующий
tempalte<class F>
void do_somthing(const std::map<int, int, F>& m) {
}
Это не обязательно плохо, но мои инстинкты говорят мне, что, имея тип, который только может быть решена с помощью общих функций плохо , Я думаю, что это отлично работает для лямбда-функций, но об этом. Решение здесь использовать STD :: функцию
#include <map>
#include <functional>
template<class Key, class Value>
using my_map_t = std::map<Key, Value, std::function<bool(const Key&, const Key&)>>;
int main() {
my_map_t<int, int> my_map{[](const int&a, const int& b) { return a < b; }};
my_map[10] = 20;
}
Теперь вы можете использовать любой предикат вы хотите, и у вас есть конкретный тип для работы, my_map
надеюсь, что это помогает!
'cmp' не является указателем на функцию. –
Do _what_? 'int' уже сравниваются друг с другом. Что ты пытаешься сделать? И почему вы не хотите использовать функцию? –
Да, указатель функции не был точным термином. Отредактировал вопрос, чтобы сделать вопрос более ясным. – MBZ