gpt4 book ai didi

c++ - 防止对不同大小的、模板化的、多态的、数学 vector 进行组件操作

转载 作者:行者123 更新时间:2023-11-30 03:24:05 25 4
gpt4 key购买 nike

我正在创建一个以元素类型和数量为模板的 vector 数学库。有一个 SizedVectorBase 结构,其中元素的数量是一个成员变量,以防止代码膨胀来自仅循环大小不同的 vector 函数(参见 Scott Meyers 的 Effective C++ Item 44)。我希望循环遍历每个元素(如 +=*= )的组件明智的运算符重载位于代码膨胀的基类中。但是,由于所有 Vectors 都派生自 SizedVectorBase,因此我想防止在不同大小的 vector 之间进行这些操作。

template<typename T>
struct SizedVectorBase
{
private:
std::size_t size;
T* pData;
protected:
SizedVectorBase<T>& operator+=(const SizedVectorBase<T>& rhs)
{
for(std::size_t i = 0; i < size; ++i)
{
pData[i] += rhs.pData[i];
}
return *this;
}
};
template<typename T, std::size_t n>
struct Vector : public SizedVectorBase<T>
{
std::array<T, n> data;

Vector<T, n>& operator+=(const Vector<T, n>& rhs)
{
static_cast<SizedVectorBase<T>&>(*this) += static_cast<const SizedVectorBase<T>&>(rhs);
return *this;
}
};

我在 SizedVectorBase 中尝试了 std::enable_if,但似乎无法访问特定实例的大小成员 *thisrhs。我遇到编译错误,例如“error C2355: 'this': can only be referenced inside non-static member functions or non-static data member initializers”和“error C2065: 'rhs': 未声明的标识符”

typename std::enable_if<this->size == rhs.size>::type
SizedVectorBase<T>& operator+=(const SizedVectorBase<T>& rhs)

然后我尝试使函数 protected 并在派生类中调用它们,但我收到一个编译警告,提示我无法访问 protected 成员:

错误 C2248:“SizedVectorBase::operator +=”:无法使用 [T=int] 访问类“SizedVectorBase”中声明的 protected 成员

如何在 SizedVectorBase 中保留大小循环的同时防止 += 使用不同大小的 vector ?

最佳答案

据我所知,您已经在那里:operator+=Vector<T,n>仅为 Vector<T,n> 定义参数(其中 n 是相同的编译时整数!),因此如果 n 将不起作用左手操作数和右手操作数不同。

好老godbolt确认是这种情况:尝试将参数中的一个大小更改为 test .

关于c++ - 防止对不同大小的、模板化的、多态的、数学 vector 进行组件操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49989465/

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