尝试在C++中使用static_cast实现begin/end

问题描述 投票:0回答:1

我正在尝试实现一个对象来轻松迭代数组,而不需要单独的每个元素(我必须这样做数百次)。当我使用经典的 for 循环时它可以工作,但是当我尝试使用

static_cast 
/
begin()
/
data()
时它无法编译。你知道错在哪里吗?
如果我有这两门课:

end()

这是将投射指针的对象:

struct Wrapper { int var1 = 0; }; struct WrapperBig: public Wrapper { int var2 = 0; };

当我尝试在 Visual Studio 2019 中编译时:

template <class T, int N> class ArrayCasted final { public: ArrayCasted(std::array<Wrapper*, N>& p): master(p) {} // Works int size() const {return static_cast<int>(master.size());} inline T* operator[](const int index) {return static_cast<T*>(master[index]);} // Fails inline T* begin() const noexcept {return static_cast<T**>(master.begin());} inline T* end() const noexcept {return static_cast<T**>(master.end());} inline T* data() const noexcept {return static_cast<T**>(master.data());} private: std::array<Wrapper*, N>& master; };

我尝试了与 std::vector 相同的操作,但是同样的问题。我认为错误出在 
Wrapper* w1 = new Wrapper(); std::array<Wrapper*, 2> values {w1, w1}; ArrayCasted<WrapperBig, 2> casted {values}; // Works! for (int i=0; i<casted.size(); ++i) { WrapperBig* current = casted[i]; current->var2 = -1; } // Fails :( C2440 for (WrapperBig* current : casted) { current->var2 = -1; }

/

begin
/
data
函数中,但我不确定为什么。我尝试了多种方法,但都失败了。
我该怎么做?

c++ arrays iterator static-cast
1个回答
0
投票

您的间接级别有点混乱。
  1. end
  2. 返回的是一个迭代器,它可能是一个指针,但也可能完全是其他东西,其中将其转换为指针将完全失败。
    如果您从 
  3. someArray.begin()
  4. 开始,您可能希望 ArrayCasted 成为
    array<Wrapper *, 2>
    如果您要将内容用作指向 
  5. array<WrapperBig *, 2>
  6. 的指针,则需要确保它们指向的实际上是
    WrapperBig
    对象。
    
    
  7. 将它们放在一起,我们可以在这个订单上得到一些东西:

WrapperBig

© www.soinside.com 2019 - 2024. All rights reserved.