如何使用C++实现add(1)(2)(3)

在codewars上被一道kata卡住了
https://www.codewars.com/kata/539a0e4d85e3425cb0000a88/train/cpp
终于升级到5,可以看答案了,看完答案发现,好简单啊

先贴一下题目

We want to create a function that will add numbers together when called in succession.

  add(1)(2);
  // returns 3

We also want to be able to continue to add numbers to our chain.

    add(1)(2)(3); // 6
    add(1)(2)(3)(4); // 10
    add(1)(2)(3)(4)(5); // 15
  //  and so on.

A single call should return the number passed in.

 add(1); // 1

We should be able to store the returned values and reuse them.

  var addTwo = add(2);
    addTwo; // 2
    addTwo + 5; // 7
    addTwo(3); // 5
    addTwo(3)(5); // 10

We can assume any number being passed in will be valid whole number.

意思呢,就是实现add(1)(2)(3); // 6,其实就是()运算符的重载,在c++中,只能用类来解决了

贴一下解决方案

class add
{
public:
	add(int n) :m_data(n) {}
	add & operator() (int n)
	{
		return add(m_data+n);
	}
	operator int() { return m_data; }//这个也很神奇
	friend bool operator== (int n, const add & y) { return n == y.m_data; }
private:
	int m_data;
};

如果想写成函数体形式可以这样

class Yoba
{
public:
   Yoba(int n) : _n(n) {}
   Yoba operator() (int n) { return Yoba(_n + n); }
   bool operator== (int n) { return _n == n; }
   int operator+ (int n) { return _n + n; }
   int operator- (int n) { return _n - n; }
   friend bool operator== (int n, const Yoba & y) { return n == y._n; }
   
private:
   int _n;
};

auto add(int n)
{
   return Yoba(n);
}

其实这些我们都能解决,我感觉重点在于这一句

 friend bool operator== (int n, const Yoba & y) { return n == y._n; }

我当时别的都写完了,但是测试用例通不过。一直没发现问题,看了答案才知道,这一条是根据测试写的,测试用到了 ‘==’判断,所以重写一下 相等运算符就好了。我一直纠结于怎么让函数返回int类型,答案返回的也是类类型,只不过判断的时候作了处理。
根据题目的要求,还需要进行这样的运算操作。

    var addTwo = add(2);
    addTwo; // 2
    addTwo + 5; // 7
    addTwo(3); // 5
    addTwo(3)(5); // 10

所以在代码中加一下

   bool operator== (int n) { return _n == n; }
   int operator+ (int n) { return _n + n; }
   int operator- (int n) { return _n - n; }

就ok了。

嗯嗯,分享到这,C++菜鸟努力升级中。

你可能感兴趣的:(KATA通关)