Função que verifica se um tipo inteiro pode ajustar um valor do tipo possivelmente diferente (inteiro)

É possível criar uma função de modelo que verifica se um tipo de dados primitivo pode se ajustar a um valor de tipo de dados primitivo potencialmente diferente? Vamos limitar o escopo para tipos inteiros no momento.

Mais precisamente: É possível criar um "um ajuste todos" funções modeladas ainda sem obter avisos de compilador (expressão booleana sempre true / false, comparação assinada / não assinada, variável não usada) e sem desabilitar verificações de aviso do compilador? As funções também devem limitar o máximo possível de verificações em tempo de execução (todos os casos triviais devem ser excluídos em tempo de compilação). Se possível, eu preferiria evitar usar extensões do C ++ 11 e similares (a menos que exista um substituto "rápido" para o C ++ "antigo").

Nota: "valor" não é conhecido em tempo de compilação, apenas seu tipo.

Exemplo de comportamento esperado:

int main(int argc, char** argv) {
    for (int i = 1; i < argc; i++) {
        const int value = atoi(argv[i]);
        std::cout << value << ": ";
        std::cout << CanTypeFitValue<int8_t>(value) << " ";
        std::cout << CanTypeFitValue<uint8_t>(value) << " ";
        std::cout << CanTypeFitValue<int16_t>(value) << " ";
        std::cout << CanTypeFitValue<uint16_t>(value) << " ";
        std::cout << CanTypeFitValue<int32_t>(value) << " ";
        std::cout << CanTypeFitValue<uint32_t>(value) << " ";
        std::cout << CanTypeFitValue<int64_t>(value) << " ";
        std::cout << CanTypeFitValue<uint64_t>(value) << std::endl;
        }

}



./a.out 6 1203032847 2394857 -13423 9324 -192992929

6: 1 1 1 1 1 1 1 1

1203032847: 0 0 0 0 1 1 1 1

2394857: 0 0 0 0 1 1 1 1

-13423: 0 0 1 0 1 0 1 0

9324: 0 0 1 1 1 1 1 1

-192992929: 0 0 0 0 1 0 1 0

Teste seu códigoAqui ouAqui.

Verifique a montagem geradaAqui.

Esta questão foi inspirada poresta postagem

questionAnswers(6)

yourAnswerToTheQuestion