Durch die Kompilierungszeit ausgelöste Bereichsprüfung für std :: vector

Das Ziel:

Ich hätte gerne eine Range Checked Version vonstd::vector'soperator [] für meine debugbuilds und keine bereichsprüfung im freigabemodus.

Die Bereichsprüfung im Debug-Modus ist offensichtlich gut für das Debuggen, führt jedoch zu einer Verlangsamung des Veröffentlichungscodes von 5% bis 10%, die ich vermeiden möchte.

Mögliche Lösungen:

Eine Lösung fand ich in Stroustrups "The C ++ Programming Language". Er hat folgendes getan:

template <class T>
class checked_vector : public std::vector<T> {
    public:
        using std::vector<T>::vector;

        //override operator [] with at()
};

Dies ist problematisch, da es von einer Klasse mit nicht virtuellem Destruktor erbt, was gefährlich ist. (Unddas Wohnzimmer war nicht zu mag diese Lösung.)

Eine andere Idee wäre eine Klasse wie diese:

template <class T>
class checked_vector {
    std::vector<T> data_;

    public:
        //put all public methods of std::vector here by hand

};

Dies wäre mühsam und würde eine große Menge an Copy-Paste erzeugen, was ebenfalls schlecht ist.

Das Schöne an beiden oben genannten Lösungen ist, dass ich sie einfach mit einer Makrodefinition in meinem Makefile ein- und ausschalten kann.

Die Fragen:

Gibt es eine bessere Lösung? (Wenn nein, warum nicht?)Wenn nicht, wird einer der oben genannten Fälle als akzeptabel angesehen? (Ich weiß, dass dies eine meinungsbasierte ist, bitte konzentrieren Sie sich auf Nr. 1, wenn möglich.)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage