я пытаюсь написать библиотеку uint128_t (/4934578/peregruzka-operatorov-s-razmescheniya), и я столкнулся с трудностями: мне нужно работать с различными типами целых чисел, такими как uint128_t ^ uint64_t
. Я написал перегрузки операторов, такие как template <typename t> uint128_t operator^(T val)
. Я также нужно иметь возможность делать uint128_t ^ uint128_t
. однако, так как мой uint128_t использует 2 uint64_t s для хранения значений, я не могу просто использовать uint128_t как T. таким образом, я написал 2 разные функции, одну с T в качестве типа аргумента и другой с типом uint128_t.
проблема в том, что компилятор использует версию T val
как для стандартных типов c ++ int, так и для uint128_t. как мне заставить компилятор различать их?
редактировать: у меня есть этот код в классе по ссылке:
template <typename T>
bool operator==(T val){
return (LOWER == (uint64_t) val);
}
bool operator==(uint128_t val){
return ((UPPER == val.upper()) && (LOWER == val.lower()));
}
если я сделаю
uint128_t a(5), b(123, 45);
uint64_t c = 6;
(a == c);
(a == b);
обе строки будут использовать оператор top. однако, поскольку uint128_t состоит из 2 частей и является объектом, компьютер будет сравнивать uint64_t с классом, а не со значением. как заставить компьютер использовать второй оператор ==?