簡體   English   中英

使用唯一指針的向量 class 的 C++ 下標運算符 []

[英]C++ subscripting operator [] for a Vector class using unique pointers

我正在使用malloc 特別是,為了提供一個最小的例子,我只展示了構造函數和下標運算符[]

#include <iostream>
#include <algorithm>
#include <utility>
#include <cstdlib>

template<typename T>
class Vector{
  std::unique_ptr<T,decltype(&free)> elem{nullptr,free}; 
  std::size_t _size{};
  std::size_t _capacity{};

public:
      
  Vector() = default;
  ~Vector(){
    for(auto i = 0; i <_size; ++i){
      // invoke the destructor
    }

  }

  Vector(std::initializer_list<T> list): // pass by value
    elem{static_cast<T*>(malloc(list.size()*sizeof(T))), free},
    _size{list.size()},
    _capacity{list.size()}{

    std::uninitialized_copy(list.begin(), list.end(), elem.get());
  }


  auto& operator[](const std::size_t i){
    return elem[i];
  }

 const auto& operator[](const std::size_t i) const{
    return elem[i];
  }
  
  
  
};

然后我實現了經典的push_back() ,但我得到的所有錯誤都來自以下:

error: no match for ‘operator[]’ (operand types are ‘const std::unique_ptr<int, void (*)(void*)>’ and ‘const size_t’ {aka ‘const long unsigned int’})
   80 |     return elem[i];

似乎問題在於我無法訪問我的unique_ptr的第i個元素,但我真的無法理解問題所在! 我該如何解決這個問題,以便我實現的所有其他功能都可以工作? 另外,我的elem[i]的問題是elemunique_prt嗎?

std::unique_ptr<T>沒有operator[] ,但std::unique_ptr<T[]>有。

所以你可以使用

std::unique_ptr<T[], decltype(&free)> elem{nullptr,free}; 

注意:使用 class 作為刪除器允許空基優化 (EBO),並簡化調用站點:

struct Free
{
    void operator()(void* p) const { free(p); }
};


std::unique_ptr<T[], Free> elem{nullptr}; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM