c++のテンプレートで

template<class T>
T get(std::string str)
{
if (std::is_signed<T>)
{
    return std::stoll(str);
}
if(std::is_unsigned_v<T>)
{
    return std::stoull(str);
}
if(std::is_floating_point_v<T>)
{
    return std::stold(str);
}
return T(str);
}

みたいなことをコンパイル時に、
整数なら

template<class T>
T get(std::string str)
{
return std::stoll(str);
}

浮動小数少数なら

template<class T>
T get(std::string str)
{
return std::stold(str);
}

それ以外なら

template<class T>
T get(std::string str)
{
    return T(str);
}

のように分けて実装したいのですが
いちいち型ごとに

template<>
int get<int>(std::string str)
{
    return std::stold(str);
}

とするのは面倒なのでもっと効率的な書き方は存在しませんか?