2016-07-23 11 views
0

Ich komme aus node.js und ich frage mich, ob es eine Möglichkeit gibt, dies in C++ zu tun. Was die C++ Äquivalent wäre:Ändern von Variablentypen nach der Initialisierung C++

var string = "hello"; 
string = return_int(string); //function returns an integer 
// at this point the variable string is an integer 

So in C++ Ich möchte wie diese Art von etwas zu tun ...

int return_int(std::string string){ 
    //do stuff here 
    return 7; //return some int 
} 
int main(){ 
    std::string string{"hello"}; 
    string = return_int(string); //an easy and performant way to make this happen? 
} 

ich mit JSON bin zu arbeiten und ich brauche ein paar Strings aufzuzählen . Ich weiß, dass ich einfach den Rückgabewert von return_int() einer anderen Variablen zuweisen könnte, aber ich möchte wissen, ob es möglich ist, den Typ der Variablen aus einem String zu einem Int umzutauschen, aus Gründen des Lernens und der Lesbarkeit.

+0

Nein, das ist nicht möglich (zumindest nicht in _ "eine einfache und performante Art, dies zu erreichen?" _). C++ korrigiert alle Variablentypen zur Kompilierzeit. –

+0

Siehe http://stackoverflow.com/questions/1517582/what-is-the-difference-between-statically-typed-and-dynamically-typed-languages ​​ –

+0

Denken Sie daran, dass es für eine Sprache nicht dasselbe ist, statisch zu sein getippt, um stark typisiert zu werden. Zum Beispiel: JavaScript ist dynamisch und schwach, was implizite Typumwandlungen erlaubt (wie x = "3" + 5). Python ist dynamisch und stark, was explizite Typumwandlungen erlaubt (entweder x = "3" + "5" oder x = 3 + 5, aber nicht gemischt). C++ ist statisch, so wie erwähnt, gibt es keinen einfachen Weg, da es nicht das erwartete Verhalten ist (Sie müssen den Typ von x zur Kompilierungszeit explizit deklarieren) –

Antwort

2

Es gibt nichts in der C++ - Sprache selbst, die dies erlaubt. Variablen können ihren Typ nicht ändern. Sie können jedoch eine Wrapper-Klasse verwenden, die Art seiner Daten erlaubt dynamisch zu ändern, wie boost::any oder boost::variant (C++ 17 addiert std::any und std::variant):

#include <boost/any.hpp> 

int main(){ 
    boost::any s = std::string("hello"); 
    // s now holds a string 
    s = return_int(boost::any_cast<std::string>(s)); 
    // s now holds an int 
} 

#include <boost/variant.hpp> 
#include <boost/variant/get.hpp> 

int main(){ 
    boost::variant<int, std::string> s("hello"); 
    // s now holds a string 
    s = return_int(boost::get<std::string>(s)); 
    // s now holds an int 
} 
+0

Ich nehme an, dass 'boost ::: get ', d. H. 3 x': ', ist ein Tippfehler? –

+0

OK, mit Template Magic ist es möglich, aber ISTM nicht annähernd so praktisch wie für Sprachen, in denen es eingebaut ist. Die hässlichen Cast-ähnlichen Konvertierungen wie 'boost :: get' und' boost :: any_cast', sowie die Deklaration der 'boost :: variant' macht es ein wenig peinlich, IMO. –

+0

@RudyVelthuis ist es keine Vorlage Magie, die dies ermöglicht zu arbeiten. Dieselbe Logik kann ohne Vorlagen ausgeführt werden. 'any' enthält grundsätzlich einen Zeiger auf einen dynamisch zugewiesenen Datenblock, der den Wert enthält. Wenn Sie einen anderen Werttyp zuweisen, wird ein neuer Block zugewiesen. "Variante" ist im Grunde nur eine typsichere Union. –

2

Das ist nicht möglich. C++ ist eine statisch typisierte Sprache, d. H. Typen können sich nicht ändern. Dies funktioniert nicht automatisch oder auf andere Weise. Sie müssen eine andere Variable für den Int verwenden. In C++ 11 und höher, können Sie tun:

std::string str = "hello"; 
auto i = return_int(str); 

Oder:

int i = return_int(str); 

Wie dem auch sei, ruft eine ganze Zahl "string" ein wenig seltsam ist, wenn Sie mich fragen.