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

标签 c++ templates inheritance

我正在创建一个以元素类型和数量为模板的 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/

相关文章:

C++ 未知类型名称模板 - Eclipse

javascript - 继承属性中使用的对象字面量会更改该类的所有实例

c++ - 继承中可用性和可访问性的区别

java - 从抽象 Activity 传递 View

c++ - 可以重置 std::call_once 吗?

c++ - 不完整类型的无效使用 "class"

wpf - 在 WPF 中突出显示整个 TreeViewItem 行

c++ - 多模板化接口(interface)继承名称隐藏

c++ - 我应该/可以/必须如何处理我的 C++ 项目所依赖的 dll?

c++ - 如何从方法返回 std::vector 而不是每次都将其作为拷贝?