через decltype? Map из строки в std::function.
template <typename StringToComponentMap>
auto Factory::makeComponent(string_view type, const StringToComponentMap &map)
-> std::result_of_t<typename StringToComponentMap::mapped_type()> {
auto it = map.find(type);
if (it != map.end())
return it->second();
else
printError(type, map);
return nullptr;
}
Это std::map?
Шаблонный параметр предполагается что std::map. Хотелось бы получить тип возвращаемый функцией храняшейся в std::map. То как тут написано у меня работает. А вот с decltype крашиться где-то в коде после использования
-> decltype(std::declval<typename StringToComponentMap::mapped_type>()())
Спасибо. Не знал про declval. А в чем различие между выведением типа с std::result_of_t и данным способом?
ты понимаешь, что nullptr должен быть совместим с возвращаемым типом из функции?
result_of_t как минимум устарел
Ага, я юник возвращаю
Use auto , Luke!
result_of и его замена invoke_result работают с Callable, способ выше явно вызывает Function без аргументов
Тут даже по семантике нельзя nullptr возвращать...
И юник тоже нельзя.
Он не мог понять кого ему возвращать, то ли нульптр то ли то что функция возвращает.
Так лучше? template <typename StringToBuildFuncMap> auto makeComponent(string_view type, const StringToBuildFuncMap &map) { using ret_t = decltype(std::declval<typename StringToBuildFuncMap::mapped_type>()()); auto it = map.find(type); if (it != map.end()) return it->second(); else printError(type, map); return ret_t{}; }
в таком варианте проще using ret_t = decltype(map.at(type)())
Минус такого подхода что он в рантайме и ищет тип по дереву ?
decltype всегда в компайл-тайме
Обсуждают сегодня