无论实际实例化如何,都接受函数签名中的模板化参数

时间:2014-10-15 19:51:54

标签: c++ templates

标题可能有点令人困惑,所以让我详细说明。

说,我有一个类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(它不起作用,我试过了)。

3 个答案:

答案 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关键字可以访问两个模板实例的私有成员。它在技术上不再是一个成员函数,但这并不重要。