【发布时间】:2016-08-23 15:42:20
【问题描述】:
我有一个类,它表示一个只能采用整数或半整数值的量,因此在内部将其值存储为一个整数,该整数是该值的两倍。即:值 0.5 存储为 1,1 存储为 2,1.5 存储为 3,等等。我们将其称为 class A,存储值 int TwoA_。
这会强制A 值正确地为整数或半整数。由于我经常需要将它们用作它们的真实值,因此我自然而然地对double 运算符进行了强制转换,该运算符仅返回0.5 * TwoA_。
但是,我经常需要使用两倍的值。我认为将2 * a 编码(a 是A 类型的对象)直接返回存储在a 中的值TwoA_ 会很简洁。
理想情况下,我想创建一个仅在从左侧乘以 2 时才执行此操作的运算符。隐式转换将涵盖所有其他情况。
有没有办法在 C++ 中做到这一点?我想到了某种模板化的乘法运算符。
仅定义的简单解决方案
friend double operator*(int lhs, const A& rhs)
{ return (lhs == 2) ? rhs.TwoA_ : lhs * static_cast<double>(rhs); }
不是我要找的。 2 * a 保证是 int(但一般 an_int * a 不是),我想返回一个 int。
这是一个好奇的问题;如果您只想评论“为什么要这样做?” (或其中的一些变体),请闭嘴。
编辑:我的意思是左边乘以整数文字2(不是一个整数变量,它被测试是否有值 2)
【问题讨论】:
-
抱歉,
2 * a和3 * a不能有不同的类型。 -
@aschepler:是的,不同的类型只能使用模板参数,例如
a.scaleby<2>()可以具有与a.scaleby<3>()不同的类型 -
@aschepler,除非您提供理由,否则您的回答完全没有帮助。
-
@DanielGr:这是语言律师的原因,您想要从标准中引用?或者知道重载解析使用参数类型而不是参数值就足够了吗?
-
请注意,您在浪费时间——double 可以精确地存储半整数而不会出现表示错误(直到您远远超出
INT_MAX)并且如果您的转换对编译器可见,它将内联它并删除多余的乘法。
标签: c++ c++11 operator-overloading template-argument-deduction