constexpr zur Berechnung von Klassen groesse nutzen



  • Hallo alle,

    steh gerade vor einem Problem wie man constexpr die Groeße eines arrays berechnen kann basierend auf einer Klasse. Hier der Beispiel Code:

    //header.h
    class ArrayContainer
    {
    public:
      constexpr ArrayContainer(){}
      static const int classConstant;
    };
    
    //cppunit.cpp
    #include "header.h"
    
    class ContainerBuffer
    {
      char buf[0xff];
    };
    
    constexpr int ArrayContainer::classConstant = sizeof(ContainerBuffer);
    }
    

    so funktioniertdas ganze. Was ich aber will ist in ein ArrayContainer von der groesse 'classConstant' anlegen und dann krieg ich den Fehler

    ./justanotherheader.h:7:13: error: call to non-static member function without an object argument
    int array[getContainerSize()];
    ^~~~~~~~~~~~~~~~

    Wieso kann ich eine const Variable als array groesse angeben?

    @Edit Ich hatte erst vor eine forward deklaration der constexpr vorzunehmen aber das ist ja leider nicht moeglich. Ich hab aber diesen draft (n3308) gefunden, weiss jmd den status davon?


  • Mod

    Es ist unklar, was du möchtest und die Fehlermeldung passt nicht zum Code. Siehe dritten Link in meiner Signatur.

    Jedenfalls fällt auf, dass du scheinbar zufällig constexpr in deinem Code verteilt hast. Das ist ganz sicher keine gute Vorgehensweise. Meinst du folgendes?

    class ArrayContainer
    {
    public:
      ArrayContainer(){}
      static const int classConstant;
    };
    
    class ContainerBuffer
    {
      char buf[0xff];
    };
    
    const int ArrayContainer::classConstant = sizeof(ContainerBuffer);
    
    int main()
    {
      int array1[ArrayContainer::classConstant];  
    }
    

    Wie du siehst, nirgendwo constexpr . Oder meinst du dies?

    class ArrayContainer
    {
    public:
      ArrayContainer(){}
      static const int classConstant;
      static constexpr int get_classConstant();
    };
    
    class ContainerBuffer
    {
      char buf[0xff];
    };
    
    const int ArrayContainer::classConstant = sizeof(ContainerBuffer);
    constexpr int ArrayContainer::get_classConstant() { return classConstant; }
    
    int main()
    {
      int array1[ArrayContainer::get_classConstant()];  
    }
    

    Hier brauchst du constexpr . Und zwar nur bei der Funktion, die hier (für den Compiler sonst nicht ersichtlich) einen immer gleichen Wert liefert.



  • Es gibt keine Funktion getContainerSize()?
    Wenn sie existieren sohl, muss sie static und constexpr sein.
    Ein constexpr Konstruktor ist dafür nicht notwendig.



  • Nathan schrieb:

    Ein constexpr Konstruktor ist dafür nicht notwendig.

    Es gibt keinen Grund, weshalb er nicht constexpr sein sollte. Der default-generierte Konstruktore wäre auch constexpr.



  • Ja, schon, aber notwendig ist es nicht.


Anmelden zum Antworten