bereichsprüfung mit templatemetaprogrammierung



  • hi

    alleine schon dass die stl-container zwei elementszugriffsoperatoren ([] und at) bereitstellen, zeigt doch dass die bereichsprüfung nicht ganz ohne ist. kann man die bereichsprüfung nicht mittels templatemetaprogrammierung machen? ich habe es mir etwa so vorgestellt:

    template<std::size_t index, std::size_t range>
    class range_check
    {
      range_check();
    public:
      static bool in_range = index < range;
    };
    
    template<typename T>
    T& container<T>::operator[] (std::size_t index)
    {
      if(range_check<index, this->lenght()>
        throw out_of_range;
      return this->memory[index];
    }
    


  • In Zeile 12 müsstest du noch ::in_range anhängen. Und zudem: Was machst du, wenn die Parameter nicht zur Compilezeit bekannt sind?



  • caesar_chiffre schrieb:

    if(range_check<index, this->lenght()>

    Das läuft nicht, weil weder length() noch index Compilezeit-Konstanten sind.



  • Ja, im Allgemeinen sind die nicht zur Compilezeit bekannt.

    Aber es gibt Fälle, wo das gehen könnte. Z.B. für Matrizen oder Vektoren, die eine zur Compilezeit bekannte Größe haben. Dazu noch Loop-Unroll und ab geht der Peter.


  • Mod

    Der Index ist aber immer noch keine Compilezeitkonstante.



  • Wenn man aber z.B. den CopyCtor mit Loop Unroll implementiert, dann ist in diesem Bereich der Index eine Compilezeitkonstante, ich könnte das jetzt auch als Beispiel anfügen, aber a) hätte man durch das LoopUnroll einen impliziten Rangecheck und b) hast du natürlich recht, das abseits solcher Spezialfälle, der Index meist nicht zur Compilezeit bekannt ist.



  • bmario schrieb:

    dann ist in diesem Bereich der Index eine Compilezeitkonstante

    Nein, es handelt sich im C++-Sinne immer noch nicht um einen konstanten Ausdruck. Deshalb kann man ihn auch nicht zur Kompilierzeit prüfen.

    Ansonsten müsste man die Compilezeit-Konstante über den Aufruf hinweg bewahren, was nur mit Templates geht.

    template <typename T, unsigned int N>
    class Array
    {
        public:
            template <unsigned int I>
            T& Get();
    };
    


  • Am Besten zeigst du uns dein konkretes Beispiel, wo du soetwas jetzt grade anwenden möchtest. Sowas gibts nicht allzu häufig, und meistens wird mans wohl anderweitig lösen bzw. es erledigt sich schon selbst. Vielleicht gibts für deinen Anwendungsfall auch eine passende Bibliothek, die auch so einen rangecheck schon mit drin hat.


Anmelden zum Antworten