Код: Выделить всё
_Vector_implКод: Выделить всё
wrapRawArrayКод: Выделить всё
#include
#include
#include
using namespace std;
template
struct _Vector_base
{
struct _Vector_impl : public _Alloc
{
_Tp* _M_start;
_Tp* _M_finish;
_Tp* _M_end_of_storage;
// etc
};
// etc
};
template
using vectorType = vector;
template
using vectorImpl = typename _Vector_base::_Vector_impl;
template
bool wrapRawArray(T(&_array)[N], vectorType* _container)
{
vectorImpl* vectImpl = (vectorImpl*)((void*)_container);
vectImpl->_M_start = _array;
vectImpl->_M_finish = vectImpl->_M_end_of_storage = vectImpl->_M_start + N;
return true;
}
template
void releaseRawArray(vectorType* _container) {
vectorImpl* vectImpl = (vectorImpl*)((void*)_container);
vectImpl->_M_finish = vectImpl->_M_end_of_storage = vectImpl->_M_start = nullptr;
}
template
class ProxyContainer
{
Container* container{ nullptr };
size_t size;
bool isRawArray{ false };
static string errorMessage;
public:
explicit ProxyContainer(Container& _container)
:container(&_container), size(_container.size()), isRawArray(false) {}
template
explicit ProxyContainer(T(&_array)[N])
:container(new Container) {
size = N;
isRawArray = wrapRawArray(_array, container);
}
~ProxyContainer() {
if (isRawArray) {
releaseRawArray(container);
if (container) {
delete container;
container = nullptr;
}
}
}
T& operator[](size_t index) {
if (index >= size) {
throw out_of_range(ProxyContainer::errorMessage
+ to_string(index));
}
return container->at(index);
}
void changeModel(Container& _container) {
container = &_container;
size = _container.size();
isRawArray = false;
}
};
int main()
{
// Raw array
int arr[] = { 1,2,3 };
ProxyContainer proxyForRawArray(arr);
proxyForRawArray[1] = 9; // throws out of bound error, the code shows runtime error at stl file line 1906 where at() function break due to container is sized 0 and input index is 1.
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... -missing-h
Мобильная версия