我想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