如何实现简单<操作者

时间:2014-05-01 14:08:04

标签: c++ c++11 operator-overloading

我有一个包含一些简单成员的类,并希望实现一个非常简单的<运算符。这就是我的开始:

inline bool operator< (const T& lhs, const T& rhs)  { return std::tie(lhs.GetA(), lhs.GetB()) < std::tie(rhs.GetA(), rhs.GetB()); }

Visual Studio抱怨

Warning 2   warning C4239: nonstandard extension used : 'argument' : conversion from 'A' to 'A &'

似乎问题是我没有使用成员,而是使用函数,并且正在将rvalue传递给非const ref。我想我可以将GetA()保存在本地A中,但不愿意。

我该如何解决这个问题?

我尝试添加

A& GetARef() const { return a; }

这不起作用,因为我试图返回带有const的非const引用。

A& GetARef() { return a; }

这不起作用,因为lhsrhs是常量。

现在我想也许我应该使用std::tuplestd::tie( std::cref(lhs.GetA()) ),或者可能是新模板

template < typename... T >
std::tuple<const T&...> ctie( const T&... args )
{
    return std::tie( args... );
}

但是我忍不住觉得我过于复杂了......

1 个答案:

答案 0 :(得分:5)

tie生成 lvalue 引用的元组,因此不会对临时工作(除非它们是const,因此扣除元组类型会给出const引用)。

您可以使用make_tuple制作对象元组,或forward_as_tuple获取左值 rvalue 引用,具体取决于参数&# 39;价值类别。

或者,您可以通过向const成员返回const引用来使访问者工作:

A const & GetARef() const { return a; }
  ^^^^^