2016-11-20 7 views
0

Ich möchte eine nicht konstante Variable in eine konstante Variable umwandeln. Ich habe versucht, mit const_cast, aber immer noch das folgende Programm gibt Fehler, dass 'Bitsize1' kann nicht in einem konstanten Ausdruck erscheinen. Was mache ich falsch ?C++: Casting nicht konstant bis konstant

#include <string> 
#include <bitset> 
#include <iostream> 
using namespace std; 
int main(){ 

int l = 3; // taken input from user 
int bitsize2 = (l * 2); 

int bitsize1 = const_cast<int&>(bitsize2); 
string temp = "100101"; 
bitset<const_cast<int&>(bitsize2)> baz (temp); 
cout << baz; 
return 0; 

} 
+1

Vorlagenparameter müssen zum Zeitpunkt der Kompilierung bekannt sein. –

+1

Sie werden verwirrt zwischen einem konstanten Ausdruck und einem konstanten Objekt. 'const' dient dazu, ein Objekt nicht modifizierbar zu machen,' consxpr' dient dazu, einen Wert zur Kompilierzeit verfügbar zu machen. –

Antwort

0

const_cast wird verwendet, um etwas const zu werfen const weg nicht zu machen. Wenn Sie die einfachste Möglichkeit, in post-C++ 11 Programmierung konstanten Ausdruck wollen, ist die Verwendung constexpr:

constexpr int l = 3; 
constexpr int bitsize2 = l * 2; 

Die Eingabe von Benutzer kann keine Kompilierung konstanter Ausdruck sein, so dass Sie etwas anderes herausfinden müssen.

+0

'const_cast' kann verwendet werden, um ** zu entfernen oder **' const' hinzuzufügen. Das Hinzufügen von 'const' kann in einigen Fällen implizit erfolgen, aber es gibt auch Fälle, in denen 'const_cast' benötigt wird. Sie haben jedoch recht, dass ein Laufzeitwert nicht in eine Kompilierzeitkonstante umgewandelt wird. –

+0

Interessant; Daran werde ich mich in Zukunft erinnern. Ich musste es nie anders herum tun. Danke für den Kopf. – SnappleLVR

0

Vorlagen werden in der Kompilierzeit erweitert, dh alle Vorlagenargumente sollten beim Kompilieren bekannt sein. Offensichtlich sind Benutzereingaben Laufzeitdaten und können daher nicht als Vorlagenargument verwendet werden.

0

Wie von anderen angegeben, können Sie Vorlagenparameter zur Laufzeit nicht ableiten.
Sie sollten mit Boost dynamic bitset verwenden.
Es existiert für das genaue Problem, das Sie kennengelernt haben.

„The dynamic_bitset Klasse ist fast identisch mit dem std :: bitset Klasse. Der Unterschied ist, dass die Größe des dynamic_bitset (die Anzahl der Bits ) zur Laufzeit während der Konstruktion eines spezifiziert ist dynamic_bitset-Objekt, wobei die Größe eines std :: -Bitset bei der Kompilierung über einen Integer-Template-Parameter angegeben wird. "