我有一个类,它表示只能取整数或半整数值的数量,因此在内部将其值存储为值的两倍的整数。也就是说:值0.5存储为1,1为2,1.5为3,等等。我们将其称为class A
,其值为int TwoA_
。
这会强制A
值为正整数或半整数。由于我经常需要将它们用作真正的值,因此我自然地向double
运算符进行了强制转换,只返回0.5 * TwoA_
。
但是,我经常需要使用两倍的值。我认为将2 * a
(a
作为A
类型的对象)编码为直接返回存储在TwoA_
内的值a
。 p>
理想情况下,我想制作一个仅在左侧乘以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。
这是好奇心的问题;如果你只想评论&#34;你为什么要这样做?&#34; (或其中的一些变体),请你的舌头。
编辑:我的意思是在左边乘以整数文字2
(不是一个整数变量,经测试它是否具有值2)
答案 0 :(得分:3)
了解您的问题,如果您可以重载*
运算符,使其根据其中一个参数的值返回不同的数据类型,简短的答案是:否。
答案很长:不,但可能是的。
double operator*(const int lhs, const A& rhs);
如果lhs
为2
,则该运营商必须知道AT COMPILE TIME,并且无法保证。这意味着必须在运行时决定如何处理lhs
是2
的情况。但是运算符返回的数据类型必须在编译时才知道......
double operator*(const some_type_1& lhs, const A& rhs);
int operator*(const some_type_2& lhs, const A& rhs);
这将获得两种不同的返回类型,但只能通过编译时知道这些参数类型是什么。
template<int T>
struct special_number{};
//...
template<>
int operator*(const special_number<2>&, const A& rhs){
return rhs.TwoA_;
}
template<int T>
double operator*(const special_number<T>&, const A& rhs){
return (static_cast<double>(rhs) / 2.0) * T;
}
//usage
int answer1 = special_number<2> * my_a_object;
double answer2 = special_number<3> * my_a_object;
这样就可以了。
答案 1 :(得分:1)
struct two_t {
constexpr two_t() {};
template<class T>
constexpr operator T()const{return 2;}
};
constexpr two_t two;
现在:
friend double operator*(two_t lhs, const A& rhs)
{ return rhs.TwoA_; }
friend double operator*(const A& lhs, two_t lhs)
{ return lhs.TwoA_; }
是你能做的最好的事情。
表达式的类型不依赖于值,除非在常量0
可以转换为指针并且可能导致不同的重载分辨率的特殊情况下。
在将2
作为细分传递给*
时,无法利用这种特殊情况使constexpr std::ptrdiff_t from_digits(std::integer_sequence<char>) {
return 0;
}
constexpr std::ptrdiff_t compile_time_pow( std::ptrdiff_t base, std::size_t exp ) {
return exp ? base * compile_time_pow( base, exp-1 ) : std::ptrdiff_t(1);
}
template<char c0, char...cs>
constexpr std::ptrdiff_t from_digits(std::integer_sequence<char, c0, cs...>) {
return
compile_time_pow(10, sizeof...(cs))*(c0-'0')
+ from_digits( std::integer_sequence<char, cs...>{} );
}
template<char...cs>
constexpr auto operator"" _integer() {
return std::integral_constant<std::ptrdiff_t, from_digits( std::integer_sequence<char, cs...>{} )>{};
}
特殊。
现在
2_integer
现在std::ptrdiff_t
是值2
的compile_time 2_integer * a
,其值的类型已编码。
因此可以覆盖3_integer * a
以返回与2 * a
或 function saveOrder () {
return ordersSrv.saveOrder(order).then(function(data) {
console.log('saveOrder OK');
},
function(error) {
console.log('saveOrder KO');
});
}
var aPromises = [saveOrder()];
$q.all(aPromises).then(function () {
console.log('OK');
},
function (error) {
console.log('---> error');
});
不同的不同类型。