У меня есть код 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"; }
Так что, кажется, недостаточно проверить, сколько памяти использует тип. Каковы другие подходы?
Вы можете проверить максимальные значения этого типа, используя определения из 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
Однако, вероятно, было бы лучшим долгосрочным решением создать систему с использованием шаблонов.