gpt4 book ai didi

c++ - 带有复制构造函数的 enable_if

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:45 29 4
gpt4 key购买 nike

我第一次尝试 std::enable_if 并且很挣扎。任何指导将不胜感激。

作为玩具示例,这是一个简单的静态 vector 类,我想为其定义一个复制构造函数,但行为取决于 vector 的相对大小:

  1. 只需将数据复制到更小或相同大小的 vector 中
  2. 将数据复制到一个更大的 vector 中,然后用零填充其余部分

所以 vector 类是:

template <size_t _Size>
class Vector
{
double _data[_Size];

public:
Vector()
{
std::fill(_data, _data + _Size, 0.0);
}

const double* data() const
{
return _data;
}

// ...
};

复制构造函数应该支持这样的事情:将 v3 的前 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,而不是简单的if语句)?

最佳答案

忽略默认值,这些构造函数的两者的签名是

template <size_t N, typename>
Vector(const Vector<N>&)

也就是说,它们最终是相同的。

区分它们的一种方法是使模板参数类型直接依赖于enable_if。的条件:

template <size_t _OtherSize,
std::enable_if_t<(_Size <= _OtherSize), int> = 0>
Vector(const Vector<_OtherSize>& v) : Vector()
{
std::copy(v.data(), v.data() + _Size, _data);
}

template <size_t _OtherSize,
std::enable_if_t<(_OtherSize < _Size), int> = 0>
Vector(const Vector<_OtherSize>& v) : Vector()
{
std::copy(v.data(), v.data() + _OtherSize, _data);
std::fill(_data + _OtherSize, _data + _Size, 0.0);
}

顺便说一句,像 _Size 这样的名字和 _OtherSize保留用于实现,因此对于用户代码是非法的——丢失下划线和/或大写字母。

此外,正如@StoryTeller 所暗示的,您不希望在 _OtherSize == _Size 时应用第一个构造函数。 ,因为编译器生成的复制构造函数具有理想的行为。所述构造函数已经不如相同大小的复制构造函数特化 Vector s,所以它不会在重载决议期间被选中,但最好通过切换 <= 来明确意图。至 < .

关于c++ - 带有复制构造函数的 enable_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46403866/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com