Возможно ли создать шаблонную функцию, которая проверяет, может ли примитивный тип данных соответствовать значению потенциально другого примитивного типа данных? Позвольте ограничить область действия целыми типами на данный момент.
Точнее: возможно ли создать шаблонные функции "one fit all", но без получения предупреждений компилятора (логическое выражение всегда истинно/ложно, сравнение с подписью/без знака, неиспользуемая переменная) и без отключения предупреждений о компиляторе? Функции также должны ограничивать как можно больше проверок во время выполнения (все тривиальные случаи следует исключать во время компиляции). Если возможно, я бы предпочел избегать использования расширений из С++ 11 и т.п. (если не существует "быстрой" замены для "старого" С++).
Примечание: "значение" не известно во время компиляции, только его тип.
Пример ожидаемого поведения:
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
Проверьте свой код здесь или здесь.
Проверьте сборку, сгенерированную здесь.
Этот вопрос был вдохновлен этим сообщением