Проверка функции, может ли целочисленный тип соответствовать значению, возможно, другого (целочисленного) типа

Можно ли создать шаблонную функцию, которая проверяет, может ли примитивный тип данных соответствовать значению потенциально различного примитивного типа данных? Давайте ограничим область действия целочисленными типами на данный момент.

Точнее: возможно ли создать шаблонные функции «один подходит всем», но без получения предупреждений компилятора (логическое выражение всегда true / false, сравнение со знаком / без знака, неиспользуемая переменная) и без отключения проверок предупреждений компилятора? Функции должны также максимально ограничивать проверки во время выполнения (все тривиальные случаи должны быть исключены во время компиляции). Если возможно, я бы предпочел избегать использования расширений из C ++ 11 и тому подобного (если не существует «быстрой» замены «старого» C ++).

Примечание: «значение» неизвестно во время компиляции, только его тип.

Пример ожидаемого поведения:

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

Проверьте свой кодВот или жеВот.

Проверьте сгенерированную сборкуВот.

Этот вопрос был вдохновленэта почта

Ответы на вопрос(6)

Ваш ответ на вопрос