标题可能有点令人困惑,所以让我详细说明。
说,我有一个类template<bool is_const> foo
,它可以根据模板参数采用两种形式之一,const或非const。这个类有一些运算符重载像
bool foo<is_const>::operator==(const foo<is_const> &other) const {
return this->a == other.a;
}
这里的实际回报值无关紧要。关键是我有很多这样的运算符,并且对于这两个操作数中的任何一个,is_const
的值都不重要。因此,我希望避免重复每个运算符(一次为is_bool==true
,一次为is_bool==false
)。是否有可能以某种方式定义函数,使is_bool
具有什么价值并不重要?有点像const foo<> &other
(它不起作用,我试过了)。
答案 0 :(得分:2)
您可以将操作员设为模板:
template <bool B>
bool operator==(const foo<B> & other) const
{
return a = other.a;
}
正如您所发现的,通常最好让运算符重载为非成员函数,可能是朋友:
template <bool A, bool B>
friend bool operator==(const foo<A> & lhs, const foo<B> & rhs)
{
return lhs.a == rhs.a;
}
答案 1 :(得分:1)
你可以有模板方法:
template<bool is_const>
class foo {
public:
template<bool is_another_const>
bool operator==( const foo<is_another_const> &other ) const;
};
答案 2 :(得分:0)
感谢你们,@ kerek-sb和@slava。即使你的答案没有真正解决问题,它也把我推向了正确的方向。
您的解决方案的问题是&other
不再是this
的同一类,因此无法访问私有成员,这对于比较运算符来说是不可或缺的。所以我开始使用friend
函数。我得到的是:
template <bool lhs_const, bool rhs_const>
friend bool operator==(const _Iterator<lhs_const>& lhs, const _Iterator<rhs_const>& rhs) {
return (lhs.m_pos == rhs.m_pos) && (lhs.m_buffer == rhs.m_buffer);
}
friend
关键字可以访问两个模板实例的私有成员。它在技术上不再是一个成员函数,但这并不重要。