如何简化此附加界面?

时间:2018-07-10 14:57:34

标签: c++

我已经为自己可以添加的东西构建了这个界面,到目前为止,它还不错。但是,我必须做*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;
}

1 个答案:

答案 0 :(得分:9)

只需添加另一层抽象。由于您的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!

Live Example