@SergejEU, чтобы оставаться в контексте темы, поступим так, вот заготовка из 2-х реализаций, в одной используется
size_t
, в другой
ptrdiff_t
.
#include <iostream>
#include <stddef.h>
template<typename T>
T& DefaultException() noexcept {
static T err;
std::cout << "out of range error" << std::endl;
return err;
}
template<typename T, size_t N,
T& (&ExceptionHandler)() noexcept = DefaultException<T>>
class testArraySize_t final {
public:
typedef T type;
typedef type& reference_type;
typedef type* pointer_type;
typedef size_t size_type;
typedef size_t index_type;
reference_type operator[](index_type index) noexcept {
return (index < size()) ? array[index] : ExceptionHandler();
}
size_type size() const { return N; }
testArraySize_t() = default;
~testArraySize_t() = default;
testArraySize_t(const testArraySize_t& rhs) = delete;
testArraySize_t(testArraySize_t&& rhs) = delete;
private:
type array[N];
};
template<typename T, size_t N,
T& (&ExceptionHandler)() noexcept = DefaultException<T>>
class testArrayPtrdiff_t final {
public:
typedef T type;
typedef type& reference_type;
typedef type* pointer_type;
typedef size_t size_type;
typedef ptrdiff_t index_type;
reference_type operator[](index_type index) noexcept {
return ((index >= 0) && (index < size()))
? array[index] : ExceptionHandler();
}
size_type size() const { return N; }
testArrayPtrdiff_t() = default;
~testArrayPtrdiff_t() = default;
testArrayPtrdiff_t(const testArrayPtrdiff_t& rhs) = delete;
testArrayPtrdiff_t(testArrayPtrdiff_t&& rhs) = delete;
private:
type array[N];
};
testArraySize_t<int, 100000> test_s;
testArrayPtrdiff_t<int, 100000> test_p;
int main(void) {
test_s[0] = 10;
test_s[1] = 10;
test_s[468] = 10;
test_s[10000] = 10;
test_p[0] = 10;
test_p[1] = 10;
test_p[468] = 10;
test_p[10000] = 10;
test_s[-1] = 0;
test_p[-1] = 0;
}
Напишите тест, в котором эти 2 реализации будут по разному отрабатывать выход за границу массива, при обращении к объектам через
operator[]
.
Запускать можете на любой платформе (МК/ПК).
Механизм исключений с++ не доступен, чтобы можно было запускать на МК, но можете определить свою функцию, и передать в качестве 3-го параметра шаблона для
testArray
-ев, или переписать функцию определенную по умолчанию. Функция должна возвращать ссылку на существующий объект того же типа, который определен первым параметром параметра шаблона для
testArray
.
Если сможете такой тест написать, и при этом, вариант с
ptrdiff_t
будет работать корректно, а вариант с
size_t
- нет, тогда вы будете абсолютно правы в данной ситуации, если же варианты будут вести себя по разному, но оба не корректно, ну ок, разница есть, а если разницы нет, то правда за мной.