我正在尝试实现一个对象来轻松迭代数组,而不需要单独的每个元素(我必须这样做数百次)。当我使用经典的 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
函数中,但我不确定为什么。我尝试了多种方法,但都失败了。我该怎么做?
您的间接级别有点混乱。
end
someArray.begin()
array<Wrapper *, 2>
。如果您要将内容用作指向 array<WrapperBig *, 2>
WrapperBig
对象。
WrapperBig