如何简化此添加界面

How do I simplify this addition interface?

本文关键字:界面 添加 何简化      更新时间:2023-10-16

我已经为自己可以添加的东西构建了这个接口,到目前为止它非常好。然而,我必须执行*a+*b来添加内容,而当您必须执行*(*a+*b)+*a时,使用它会很快变得很烦人。有没有一种方法可以修改它,使其更易于使用?

#include <iostream>
#include <memory>
#include <set>
#include <map>
#include <string>

class iResult
{
public:
virtual std::shared_ptr<iResult> operator+(const iResult& rhs) const = 0 ;
virtual std::string print() const = 0;
};

class intResult : public iResult
{
public:
intResult(int b) : num(b) {};
std::string print() const
{
return std::to_string(num);
}
std::shared_ptr<iResult> operator+(const iResult& rhs) const 
{
return std::make_shared<intResult>(num + dynamic_cast<const intResult&>(rhs).num);
}
private:
const int num;
};

int main()
{
std::shared_ptr<iResult> a = std::make_shared<intResult>(3);
std::shared_ptr<iResult> b = std::make_shared<intResult>(4);
std::shared_ptr<iResult> c = *a + *b;
std::shared_ptr<iResult> z = *(*a + *b) + *a; //Gross!
std::cout << c->print() << std::endl;
std::cout << z->print() << std::endl;
return 0;
}

只需添加另一层抽象即可。由于你的operator+想要一个const iResult&,你可以添加另一个重载,它占用const std::shared_ptr<iResult>&并在其中执行所有的去引用

std::shared_ptr<iResult> operator +(const std::shared_ptr<iResult>& rhs, const std::shared_ptr<iResult>& lhs)
{
return *rhs + *lhs;
}

到全局空间,然后在main()

std::shared_ptr<iResult> c = *a + *b;
std::shared_ptr<iResult> z = *(*a + *b) + *a; //Gross!

成为

std::shared_ptr<iResult> c = a + b;
std::shared_ptr<iResult> z = a + b + a; //Nice!

实际示例