我想寫我的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;'這不是倒退? –