Función que verifica si un tipo entero puede ajustarse a un valor de tipo posiblemente diferente (entero)

¿Es posible crear una función de plantilla que verifique si un tipo de datos primitivo puede ajustarse a un valor de un tipo de datos primitivo potencialmente diferente? Limitemos el alcance a tipos enteros por el momento.

Más precisamente: ¿es posible crear funciones con plantillas "una sola para todas" pero sin obtener advertencias del compilador (expresión booleana siempre verdadera / falsa, comparación firmada / sin firmar, variable no utilizada) y sin desactivar las comprobaciones de advertencia del compilador? Las funciones también deben limitar tanto como sea posible las verificaciones en tiempo de ejecución (todos los casos triviales deben excluirse en el momento de la compilación). Si es posible, preferiría evitar el uso de extensiones de C ++ 11 y similares (a menos que exista un reemplazo "rápido" para C ++ "antiguo").

Nota: "valor" no se conoce en el momento de la compilación, solo su tipo.

Ejemplo de comportamiento 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

Prueba tu códigoaquí oaquí.

Compruebe el conjunto generado.aquí.

Esta pregunta fue inspirada poresta publicación

Respuestas a la pregunta(6)

Su respuesta a la pregunta