Макрос компилятора для проверки разницы между uint64_t и unsigned long long int

У меня есть код C ++ 11, который не удается скомпилировать, потому что перегруженная функция переопределена с теми же типами, что и аргументы:

char const* foo(uint64_t) { return "%" PRIu64; }
char const* foo(unsigned long long int) { return "%llu"; }

Можно ли добавить макрос компилятора, чтобы проверить равенство между этими двумя примитивами, а затем вырезать второй, если он эквивалентен, перед компиляцией?

Существуют другие функции, которые возвращают символьные указатели для других типов. Например, добавление этого не вызывает у меня никаких проблем, даже если signed и unsigned long long int использовать такое же количество байтов:

char const* foo(long long int) { return "%lld"; }

Так что, кажется, недостаточно проверить, сколько памяти использует тип. Каковы другие подходы?

3

Решение

Вы можете проверить максимальные значения этого типа, используя определения из climits а также cstdint:

#include <climits>
#include <cstdint>

char const* foo(uint64_t) { return "%" PRIu64; }

//ULLONG_MAX defined in climits, UINT64_MAX in cstdint
#if ULLONG_MAX != UINT64_MAX

char const* foo(unsigned long long int) { return "%llu"; }

#endif

Однако, вероятно, было бы лучшим долгосрочным решением создать систему с использованием шаблонов.

2

Другие решения


По вопросам рекламы [email protected]