LINUX.ORG.RU

Как бы передать инициализированный скобками ({{t1,t2},{t1,t2}}) std::map в шаблонную функцию?

 ,


0

2

Есть такая функция:

template<typename T>   
T enumParser(/*boring parameters*/,  std::map<std::string, T>& str2enum)

Я могу без проблем передать туда переменную типа std::map<std::string, T>. Но мне очень хтелось бы делать так:

enumParser(/*boring parameters*/,{{"str1", value_of_T_type}});

Я потыкал немного палочкой в доки и т.п. и выяснил что такие вещи передаются в виде std::initializer_list, так что поигрался с вариантами ароде std::initializer_list<std::pair<const std::string, T>> или std::initializer_list<pair_type> в надежде позже разобраться что делать с typename pair_type. Ничего интересного из этого не вышло.

Это вообще возможно? Использую GCC 11.


Ну да, это std::initializer_list. А что конкретно не вышло-то?

#include <iostream>
#include <map>

template <typename T>
void accept_a_map(const std::map<std::string, T> &map)
{
        for (const auto &p: map) {
                std::cout << "map[" << p.first << "] = " << p.second << std::endl;
        }
}

template <typename T>
void accept_a_map(std::initializer_list<std::pair<const std::string, T>> il)
{
        accept_a_map(std::map<std::string, T>(std::move(il)));
}

int main()
{
        accept_a_map<int>({ {"one", 1}, {"two", 2} });
}
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

А компилятор у тебя обычный? Нечто подобное (только в виде одной ф-ции) я и хотел написать. Видимо где-то натупил.

Usruser
() автор топика
Ответ на: комментарий от intelfx

Функция:

template<typename T>
T enumParser(std::initializer_list<std::pair<const std::string, T>> str2enum)
{
	exit(EXIT_FAILURE);
}

Вызов:

enumParser({{"copy",1},{"rename",2}});

Ошибка:

couldn’t deduce template parameter ‘T’
Usruser
() автор топика
Ответ на: комментарий от intelfx

Я создал тред на реддите, туда же приложил минимальный нерабочий код.

https://old.reddit.com/r/cpp_questions/comments/tucopt/how_to_pass_a_braces_inited_stdmap_into_the/

А, ты хочешь, чтобы T выводился!

Я практически не разбираюсь в шаблонах, но void функция ведёт себя точно так же. Но да, мне нужно чтобы функция возвращала T. Или ты не об этом?

Usruser
() автор топика
Ответ на: комментарий от intelfx

Мне ничего (кроме чувства прекрасного) не мешает добавить параметр-пустышку с Т типом. Должно сработать.

Usruser
() автор топика
Ответ на: комментарий от Usruser

Ну тогда можно и сразу тип в скобках написать, как у меня в примере.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от Usruser

Конкретные сслыки не помню, но по моей памяти - brace-list’ам запрещено выводить шаблонные параметры, категорически запрещено. Так что либо

call(Type{})

либо

#define call_macro(a) call(Type{})
kvpfs ★★
()
Ответ на: комментарий от intelfx

Вроде работает. Спасибо что повозился. Сам бы я плюнул, сославшись на шаблонную говно-магию, и переключился бы на другую задачу.

Usruser
() автор топика
Ответ на: комментарий от intelfx
accept_a_map(std::map<std::string, T>(std::move(il)));

В целом move() здесь лишний, т.к. внутри initializer_list указатель и целочисленное значение (ну или два указателя).

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.