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