Возврат определённого типа значинеия функцией в зависимости от типа аргумента

Возможно ли вернуть определённый тип значения функции в зависимости от типа аргумента без использования перегрузки функции? Вот пример:

#include <string>
#include <iostream>
#include <typeinfo>
#include <cmath>
using namespace std;

template <typename T>
string f_d(T num)
{ 
    if (typeid(num).name() == typeid(int).name())
    {
        string res;
        return string(res.crbegin(), res.crend());
    }
    else if (typeid(num).name() == typeid(string).name())
    {
        unsigned int res;
        return res;
    }

}

Функция должга возвращать string, если тип аргумента int и unsigned int, если тип аргумента string


Ответы (1 шт):

Автор решения: KoVadim

Используя 17 плюсы - конечно можно

#include <string>
#include <iostream>
#include <typeinfo>
#include <cmath>
using namespace std;

template <typename T>
typename std::conditional<std::is_same<T, int>::value, std::string, unsigned int>::type f_d(T num)
{ 
    if constexpr (std::is_same<T, int>::value)
    {
        string res = "test";
        return string(res.crbegin(), res.crend());
    }
    if constexpr (std::is_same<T, std::string>::value)
    {
        unsigned int res = 1;
        return res;
    }

}
int main()
{
    std::cout << f_d(1) << "\n";
    std::cout << f_d(std::string("data")) << "\n";
}

если же не, тогда придется использовать в качестве возвращаемого значения std::variant<string, unsigned int>, хотя это тоже 17:) (но всегда есть буст).

P.S. А зачем так могло понадобиться? просто интересно, может есть решение попроще.

→ Ссылка