Проверка диапазона запуска по времени компиляции для std :: vector
Цель:
Я хотел бы иметь проверенную версиюstd::vector
«soperator []
для моих отладочных сборок и без проверки диапазона в режиме выпуска.
Проверка диапазона в режиме отладки, очевидно, хороша для отладки, но вызывает замедление на 5–10% в моем коде выпуска, которого я хотел бы избежать.
Возможные решения:
Я нашел решение в Страуструпе "Язык программирования C ++". Он сделал следующее:
template <class T>
class checked_vector : public std::vector<T> {
public:
using std::vector<T>::vector;
//override operator [] with at()
};
Это проблематично, потому что он наследуется от класса с не виртуальным деструктором, который опасен. (А такжесалон не было слишком любит это решение.)
Другой идеей будет такой класс:
template <class T>
class checked_vector {
std::vector<T> data_;
public:
//put all public methods of std::vector here by hand
};
Это было бы утомительно и создавало бы большое количество копий-вставок, что тоже плохо.
Хорошая вещь в обоих вышеупомянутых решениях состоит в том, что я могу просто включать и выключать их с помощью макроопределения в моем make-файле.
Вопросы:
Есть ли лучшее решение? (Если нет, то почему?)Если нет, считается ли одно из вышеперечисленного приемлемым? (Я знаю, что это основано на мнении, пожалуйста, сосредоточьтесь на № 1, если это возможно.)