C++ 如何简化此添加接口?

C++ 如何简化此添加接口?,c++,C++,我已经为可添加的东西构建了这个界面,到目前为止,它相当不错。然而,我必须做*a+*b来添加东西,当你必须做*(*a+*b)+*a时,使用它会很快变得很烦人。有没有办法修改它使之更易于使用 #include <iostream> #include <memory> #include <set> #include <map> #include <string> class iResult { public: virtual st

我已经为可添加的东西构建了这个界面,到目前为止,它相当不错。然而,我必须做
*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;
}
#包括
#包括
#包括
#包括
#包括
类iResult
{
公众:
虚拟标准::共享ptr运算符+(常量iResult&rhs)常量=0;
虚拟std::string print()常量=0;
};
类intResult:公共iResult
{
公众:
intResult(intb):num(b){};
std::string print()常量
{
返回std::to_字符串(num);
}
std::共享ptr运算符+(常量iResult和rhs)常量
{
返回std::make_shared(num+dynamic_cast(rhs).num);
}
私人:
常量int num;
};
int main()
{
std::shared_ptr a=std::make_shared(3);
std::shared_ptr b=std::make_shared(4);
std::shared_ptr c=*a+*b;
std::shared_ptr z=*(*a++*b)+*a;//总!

std::cout print()只需添加另一层抽象。由于您的
运算符+
需要
常量结果&
,因此您可以添加另一个重载,该重载接受
常量std::shared\u ptr&
并执行其中的所有解引用。如果您添加

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

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

我看不出使用
std::shared\u ptr
的原因。为什么要为
operator+
返回一个不同的类型,即用于操作的类型?好奇地想知道这个用例是什么……实际的类需要保留在接口后面,它由其他东西管理,所以应该只有一个指向接口的指针返回,它生活在一个
std::shared_ptr
中,但这是用户的责任。您不应该为用户选择是否使用
std::shared_ptr
std::unique_ptr
、原始指针或任何东西(仅提及Boost指针或auto_ptr)。如果您尝试使用另一种类型的
iResult
添加
intResult
,此操作将崩溃。这是您的接口允许的,但您的实现不支持。在我看来,多态性在这里并不合适。
std::shared_ptr<iResult> c = a + b;
std::shared_ptr<iResult> z = a + b + a; //Nice!