任何定义"倍增"的方法运营商?

时间:2016-08-23 15:42:21

标签: c++ c++11 operator-overloading template-deduction

我有一个类,它表示只能取整数或半整数值的数量,因此在内部将其值存储为值的两倍的整数。也就是说:值0.5存储为1,1为2,1.5为3,等等。我们将其称为class A,其值为int TwoA_

这会强制A值为正整数或半整数。由于我经常需要将它们用作真正的值,因此我自然地向double运算符进行了强制转换,只返回0.5 * TwoA_

但是,我经常需要使用两倍的值。我认为将2 * aa作为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)

2 个答案:

答案 0 :(得分:3)

了解您的问题,如果您可以重载*运算符,使其根据其中一个参数的值返回不同的数据类型,简短的答案是:否。

答案很长:不,但可能是的。

double operator*(const int lhs, const A& rhs);

如果lhs2,则该运营商必须知道AT COMPILE TIME,并且无法保证。这意味着必须在运行时决定如何处理lhs2的情况。但是运算符返回的数据类型必须在编译时才知道......

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'); }); 不同的不同类型。