【发布时间】:2011-05-25 04:18:52
【问题描述】:
我正在尝试编写一个 uint128_t 库 (http://stackoverflow.com/questions/6119306/operator-overloading-c-placement) 并且遇到了一个问题:我需要对不同类型的整数进行操作,例如 @ 987654321@。我已经编写了运算符重载,例如template <typename t> uint128_t operator^(T val)。我还需要能够做到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);
这两行都将使用顶部运算符。但是,由于 uint128_t 是 2 个部分,并且是一个对象,因此计算机会将 uint64_t 与一个类进行比较,而不是与一个值进行比较。如何强制计算机使用第二个 == 运算符?
【问题讨论】:
-
一些示例代码会非常有用
-
您确定在这两种情况下都使用顶级版本吗?在比较两个 uint128_t 时,C++ 的重载决议应该总是更喜欢确切的非模板函数而不是模板版本。
-
这似乎是在做什么。我还在检查...
-
好吧...它似乎不像我声称的那样使用相同的功能。
标签: c++ templates operator-overloading