如何解决使用模板时选择右等号运算符
| 我试图编写一个uint128_t库(http://stackoverflow.com/questions/6119306/operator-overloading-c-placement),但我遇到了麻烦:我需要对不同类型的int进行操作,例如uint128_t ^ uint64_t
。我写了诸如ѭ1as这样的运算符重载。我还需要能够做uint128_t ^ uint128_t
。但是,由于我的uint128_t使用2个uint64_t来存储值,所以我不能简单地将uint128_t用作T。因此,我编写了2个不同的函数,一个以T作为参数类型,另一个以uint128_t作为类型。
问题是编译器对标准c ++ int类型和uint128_t都使用T val
版本。我如何让编译器区分它们?
编辑:我在链接中的类中有此代码:
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与类而不是值进行比较。我如何强制计算机使用第二个==运算符?
解决方法
除了转换构造函数之外,您甚至不需要其他任何重载。然后,您只需编写处理uint128_t的运算符,然后尝试传递其他可转换类型(例如int),则将使用转换构造函数对其进行转换,然后将调用适当的运算符。
看,这可行:
#include <cstdint>
#include <iostream>
class uint128_t{
private:
uint64_t UPPER,LOWER;
public:
// constructors
uint128_t(){
UPPER = 0;
LOWER = 0;
}
template <typename T>
uint128_t(T val){
UPPER = 0;
LOWER = (uint64_t) val;
}
template <typename S,typename T>
uint128_t(const S & upper_val,const T & lower_val){
UPPER = (uint64_t) upper_val;
LOWER = (uint64_t) lower_val;
}
uint64_t upper() const{
return UPPER;
}
uint64_t lower() const{
return LOWER;
}
uint128_t & operator+=(const uint128_t & rhs)
{
uint64_t old_lower = LOWER;
LOWER += rhs.LOWER;
if(LOWER < old_lower)
++UPPER;
UPPER += rhs.UPPER;
return *this;
}
};
bool operator==(const uint128_t & lhs,const uint128_t & rhs){
return ((lhs.upper() == rhs.upper()) && (lhs.lower() == rhs.lower()));
}
int main()
{
uint128_t v(25);
v += 25;
int c = 50;
if(v == c)
std::cout << \"Good\";
if(v == c + 1)
std::cout << \"Bad\";
}
http://ideone.com/BEq03
,尝试将模板运算符从类中移出并使其变为全局,然后指定所需的特定转换,即:
template<typename T>
bool operator==(uint128_t v1,T v2)
{
return (v1.lower() == (uint64_t) v2);
}
template<>
bool operator==(uint128_t v1,uint128_t v2)
{
return ((v1.upper() == v2.upper()) && (v1.lower() == v2.lower()));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。