Sprawdzanie funkcji, jeśli typ liczby całkowitej może pasować do wartości możliwie innego typu (liczby całkowitej)

Czy można utworzyć funkcję szablonową, która sprawdza, czy pierwotny typ danych może zmieścić wartość potencjalnie innego prymitywnego typu danych? Ograniczmy teraz zakres do typów całkowitych.

Dokładniej: Czy możliwe jest jeszcze utworzenie „jednego dopasowania do wszystkich” funkcji szablonów bez uzyskiwania ostrzeżeń kompilatora (wyrażenie boolowskie zawsze prawda / fałsz, podpisane / niepodpisane porównanie, nieużywana zmienna) i bez wyłączania sprawdzania ostrzeżeń kompilatora? Funkcje powinny również ograniczać jak najwięcej kontroli w czasie wykonywania (wszystkie trywialne przypadki powinny być wykluczone w czasie kompilacji). Jeśli to możliwe, wolałbym unikać używania rozszerzeń z C ++ 11 i podobnych (chyba że istnieje „szybka” wymiana „starego” C ++).

Uwaga: „wartość” nie jest znana w czasie kompilacji, tylko jej typ.

Przykład oczekiwanego zachowania:

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

Przetestuj swój kodtutaj lubtutaj.

Sprawdź wygenerowany zespółtutaj.

To pytanie zostało zainspirowane przezten post

questionAnswers(6)

yourAnswerToTheQuestion