Определить возвращаемый тип перегруженной функции в шаблоне

96
25 августа 2019, 13:20

У меня возникает проблема с определением типа возвращаемого значения перегруженной функции внутри шаблона. Возвращаемый тип зависит от параметра, который передается в шаблон. Сразу приведу минимальный рабочий пример:

#include <vector>
// У меня есть несколько типов
struct a { a() {} };
struct b { b() {} };
struct c { c() {} };
// И одна функция, перегруженная с разными входными и выходными параметрами
a foo(b) { return a(); }
b foo(c) { return b(); }
c foo(a) { return c(); }
// Проблема: как определить C автоматически?
template<class T, class C>
std::vector<C> fooMas(const std::vector<T>& mas) {
    std::vector<C> result;
    for (auto i : mas)
        result.push_back(foo(i));
    return result;
}
int main() {
    std::vector<a> amas(5, a());
    std::vector<c> cmas = fooMas<a, c>(amas);
    //std::vector<c> cmas = fooMas(amas); // Здесь возникает ошибка
}

Вручную такое писать бы не хотелось, потому что у меня много типов, и много перегруженных функций, и все их надо перевести на такое обращение с массивом. Хотелось бы это автоматизировать с помощью вышеописанного шаблона, но не представляю как. Помогите пожалуйста.

Answer 1
template<typename T> auto // возвращаемый тип выводится из return result
fooMas(::std::vector<T> const & mas)
{
    ::std::vector<decltype(foo(mas.front()))> result{}; // выводим из результата функции
    for(auto const & i : mas)
    {
        result.emplace_back(foo(i));
    }
    return result;
}
READ ALSO
Как использовать CefCookieManager вместе с java.net.URL

Как использовать CefCookieManager вместе с java.net.URL

Куки заранее получил через авторизацию браузера CefBrowserДелаю так:

124
VK oauth2 client_secret is undefined

VK oauth2 client_secret is undefined

Я получаю такую ошибку

107
База данных в графическом интерфейсе

База данных в графическом интерфейсе

Я создал программу на java с интерфейсом школьный журналИ там в меню есть кнопка которая выводит всех студентов которые хранятся у меня в базе...

114