我想写我的vec类。为了提高效率,我使用移动语义。在C++中,是否有任何方法来减少具有移动语义的成员函数的数量?
Vec<int> v1;
Vec<int> v2;
Vec<int> v3;
Vec<int> v4;
v4 = v1 + v2; // Line 1
v4 = v1 + v2 + v3; // Line 2
v4 = v1 + (v2 + v3); // Line 3
但是,为了让上面的每一行只调用一次拷贝构造函数,我必须用一个操作符重载四个函数。像下面的代码一样。
Vec(Myself&& v)
{ // move consturctor
dim = v.dim;
value = std::move(v.value);
}
Myself& operator+= (const Myself& v)
{
for (size_type i = 0; i < dim; ++i) (*this)[i] += v[i];
return *this;
}
template<typename std::enable_if<!std::is_reference<Myself>::value>::type* = nullptr> // SFINAE
friend Myself& operator+ (Myself&& a, const Myself& b)
{
return a += b;
}
Myself& operator+ (Myself&& v) const
{
return v += *this;
}
Myself operator+ (const Myself& v) const
{
Myself ansV(*this);
ansV += v;
return ansV;
}
感谢亮度种族在轨道的提醒。我将移动构造函数添加到上面的代码中。
1.有什么办法可以为一个操作符编写较少的函数吗?
2.为什么在功能friend Myself& operator+ (Myself&& a, const Myself& b)
上添加了SFINAE,而不是Myself& operator+ (Myself&& v) const
?它用于修复v4 = v1 + (v2 + v3);
的混淆。
在哪里你的动作?我没有看到任何。 –
每个问题请提出一个问题。 –
'return v + = * this;'这不是倒退? –