我想std :: enable_if第一次和掙扎。 任何指導將不勝感激。enable_if與複製構造函數
當作玩具例子,這裏是一個簡單的靜態矢量類,爲此我要定義一個拷貝構造函數,但行爲取決於載體的相對大小:
- 只是將數據複製到更小或相同大小的矢量
- 複製數據到一個較大的載體中,然後墊用零
其餘部分,以便所述載體類是:
template <size_t _Size>
class Vector
{
double _data[_Size];
public:
Vector()
{
std::fill(_data, _data + _Size, 0.0);
}
const double* data() const
{
return _data;
}
...
};
拷貝構造函數應該支持這樣的事情,第3版第2個元素複製到V2:
Vector<3> v3;
Vector<2> v2(v3);
我試過行爲1.像這樣的拷貝構造函數,編譯:
template <size_t _OtherSize,
typename = typename std::enable_if_t<_Size <= _OtherSize>>
Vector(const Vector<_OtherSize>& v) : Vector()
{
std::copy(v.data(), v.data() + _Size, _data);
}
,但編譯器無法將其與行爲2區分開來,即使enable_if條件是互斥的。
template <size_t _OtherSize,
typename = typename std::enable_if_t<_OtherSize < _Size>>
Vector(const Vector<_OtherSize>& v) : Vector()
{
std::copy(v.data(), v.data() + _OtherSize, _data);
std::fill(_data + _OtherSize, _data + _Size, 0.0);
}
我也試圖把enable_if的說法相反,但它不能推斷_OtherSize的價值:
template <size_t _OtherSize>
Vector(const typename std::enable_if_t<_Size <= _OtherSize,
Vector<_OtherSize>> & v)
: Vector()
{
std::copy(v.data(), v.data() + _Size, _data);
}
什麼是做到這一點(使用enable_if,不是一個簡單的最佳方式如果聲明)?
感謝
根據定義,複製構造函數不能是模板。你可以有一個模板化的構造函數來複制,但它仍然不會是一個複製構造函數。 ; - ] – ildjarn
這不是問題,但是以下劃線開頭的名稱後跟大寫字母('_Size','_OtherSize')和包含兩個連續下劃線的名稱將保留供實施使用。不要在你的代碼中使用它們。 –
不相關,但在'std :: enable_if_t'之前不需要'typename'。 – Oktalist