Einfaches constexpr LookUpTable in C ++ 14

8

Ich versuche, ein einfaches LookUpTable basierend auf einem Array von Ganzzahlen zu erstellen, wobei die Idee darin besteht, es zu Kompilierzeit berechnen zu lassen .

Um es möglich zu machen, es für andere Zukunftstabellen verschiedener Integertypen zu verwenden, die ich haben könnte, brauche ich es als Vorlage .

Ich habe also ein LookUpTable.h

%Vor%

Und ich versuche, es in einer Klasse für die schnelle Dämpfung eines ganzzahligen Signals in einem ganzzahligen Abstand zu verwenden.

z. Dies ist nur eine Beispielverwendung als Foo.h

%Vor%

Ich habe versucht, dies auf verschiedene Arten zu tun, indem ich das Youtube-Video-Tutorial von CppCon 2015: Scott Schurr "constexpr: Applications" und andere benutze, aber es wird nicht kompiliert, wenn es den Fehler gibt;

%Vor%

und die statischen Behauptungen schlagen mit

fehl %Vor%

zeigt an, dass bei Kompilierzeit nichts berechnet wird.

Ich bin neu in C ++.

Ich weiß, dass ich etwas Offensichtliches mache, aber ich weiß nicht, was es ist.

Verwende ich statisch oder consxpr ?

numerische_limits sind conexpr?

Was mache ich falsch? Danke.

    
David H Parry 07.09.2016, 11:22
quelle

1 Antwort

0

Einige Beobachtungen

1) wie von michalsrb beobachtet , Foo ist nicht Wenn Sie m_distanceAttenuation initialisieren und DistanceAttenuation Teil von Foo ist, ist sie unvollständig.

Leider können Sie ein static constexpr -Member mit einem unvollständigen Typ nicht initialisieren (wie besser erklärt von jogojapan in dieser Antwort ).

Vorschlag: define DistanceAttenuation it außerhalb (und vorher) Foo ; also ist es ein vollständiger Typ und kann verwendet werden, um m_distanceAttenuation zu initialisieren; etwas wie

%Vor%

2) in C ++ 14, eine constexpr Methode ist keine const Methode; Vorschlag: Definieren Sie die folgende Methode auch als const oder Sie können sie nicht in einigen constexpr -Ausdrücken verwenden

%Vor%

3) in attenuateBy() , der Test im folgenden for ist immer wahr

%Vor%

weil std::size_t immer >= 0 ist, also geht for in Schleife und wird nie beendet; Vorschlag: Definieren Sie i als int oder long

neu

4) in attenuateFoo() verwenden Sie m_DistanceAttenuation wobei die Variable als m_distanceAttenuation definiert ist; Vorschlag: Korrekter Name der verwendeten Variablen

5) in attenuateFoo() Sie rufen die Methode attenuateSignalByDistance() mit dem Operator :: auf; Vorschlag: Verwenden Sie den Operator . , also (unter Berücksichtigung von Punkt (4) auch)

%Vor%     
max66 07.09.2016 12:38
quelle

Tags und Links