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.
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
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
3) in attenuateBy()
, der Test im folgenden for
ist immer wahr
weil std::size_t
immer >= 0
ist, also geht for
in Schleife und wird nie beendet; Vorschlag: Definieren Sie i
als int
oder long
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)
Tags und Links c++ c++14 constexpr lookup-tables