Mapeando um valor de parâmetro de modelo integral para um tipo primitivo

Quero mapear um número para um tipo. Neste exemplo, criarei uma função que mapeia um resultado sizeof () para um tipo primitivo assinad

Estou me perguntando se existe uma maneira melhor de fazer o que fiz abaixo no C ++ moderno, que é pegar um valor de modelo e convertê-lo em um tipo. No momento, isso funciona na conversão de um tamanho para um tipo conhecido, mas não consigo encontrar nada na biblioteca padrão que faça o que eu quero. Perdi alguma coisa?

Se não, existe uma maneira melhor de fazer isso ou limpar esse código? Por exemplo, se de alguma forma no futuro acabarmos tendo tipos de 128 bits, isso não suportaria iss

#include <iostream>
#include <type_traits>

template <size_t S>
static constexpr auto sizeToType() {
    static_assert(S == 1 or S == 2 or S == 4 or S == 8, "Bad type size");

    if constexpr (S == 1)
        return int8_t{};
    else if constexpr (S == 2)
        return int16_t{};
    else if constexpr (S == 4)
        return int32_t{}; 
    else
        return int64_t{};
}

int main() {
    using MY_TYPE = decltype(sizeToType<2>());

    MY_TYPE myType = MY_TYPE(0xFFFFFFFFFFFFFFFEUL);

    std::cout << sizeof(MY_TYPE) << " bytes" << std::endl;
    std::cout << "MY_TYPE(0xFFFFFFFFFFFFFFFEUL) = " << myType << std::endl;
}

Saída (conforme o esperado):

2 bytes
MY_TYPE(0xFFFFFFFFFFFFFFFEUL) = -2

questionAnswers(2)

yourAnswerToTheQuestion