Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载派生类的比较运算符==以缩放任意数量的基类_C++_Templates_Operator Overloading_Boost Mpl - Fatal编程技术网

C++ 重载派生类的比较运算符==以缩放任意数量的基类

C++ 重载派生类的比较运算符==以缩放任意数量的基类,c++,templates,operator-overloading,boost-mpl,C++,Templates,Operator Overloading,Boost Mpl,我希望您能提供一些指导,说明如何重载派生类的比较运算符运算符==,派生的,以便它可以扩展到任意数量的基类,Base1、Base2、Base3、,(请参阅下面的代码,完整版本)。我怀疑bost MPL for_每个或一些类似的构造可能都可以用来调用基类(类型)列表上的比较 编辑 我不能使用C++11(很抱歉省略了)。您可以使用类似于: template <typename T, typename Base, typename ...Bases> struct compare_bases

我希望您能提供一些指导,说明如何重载派生类的比较运算符
运算符==
派生的
,以便它可以扩展到任意数量的基类,
Base1、Base2、Base3、
,(请参阅下面的代码,完整版本)。我怀疑bost MPL for_每个或一些类似的构造可能都可以用来调用基类(类型)列表上的比较

编辑


我不能使用C++11(很抱歉省略了)。

您可以使用类似于:

template <typename T, typename Base, typename ...Bases>
struct compare_bases {
    bool operator () (const T&lhs, const T& rhs) const {
        return static_cast<const Base&>(lhs) == static_cast<const Base&>(rhs)
               && compare_bases <T, Bases...>()(lhs, rhs);
    }
};

template <typename T, typename Base>
struct compare_bases<T, Base> {
    bool operator()(const T&lhs, const T& rhs) const {
        return static_cast<const Base&>(lhs) == static_cast<const Base&>(rhs);
    }
};
模板
结构比较库{
布尔运算符()(常数T&lhs、常数T&rhs)常数{
返回静态施法(lhs)=静态施法(rhs)
&&比较_碱基()(lhs、rhs);
}
};
模板
结构比较库{
布尔运算符()(常数T&lhs、常数T&rhs)常数{
返回静态_-cast(lhs)=静态_-cast(rhs);
}
};
然后

bool Derived::operator==( const Derived& rhs ) const
{
    return compare_bases<Derived, Base1, Base2>()(*this, rhs);
}
bool-Derived::operator==(const-Derived&rhs)const
{
返回compare_base();
}

不是答案,但是做
Base1::operator==(rhs)
Base2::operator==(rhs)
不是更简单吗?谢谢,但我不能使用C++11。我已经修改了我的问题。@Olumide:实际上在C++11之前,你可以用一个类型列表来实现这个功能,但是更多cumbersome@DieterL你的意思是说你的打字单?是的,我知道它们,但我很难在Boost MPL中找到任何类似Loki样式的类型列表。@Olumide是这个答案的非c++11版本,它使用Boost.Preprocessor模拟可变模板。(我还更改了函数的结构)。如果你想要超过10个碱基,你必须将
BOOST\u PP\u REPEAT\u从\u更改为
调用。你的答案提供了C++03实现思想的核心,因此我将其标记为答案。
bool Derived::operator==( const Derived& rhs ) const
{
    return compare_bases<Derived, Base1, Base2>()(*this, rhs);
}