Проверка диапазона запуска по времени компиляции для 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, если это возможно.)

Ответы на вопрос(2)

Ваш ответ на вопрос