2016-07-23 16 views
0

私はnode.jsから来ています。これをC++で行う方法があるかどうかは疑問でした。何のC++と同等以下のようになります。初期化後の変数型の変更C++

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

だから、C++では、私は一種のこのような何かをしたい...

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? 
} 

私はJSONで働いていると私はいくつかの文字列を列挙する必要があります。 return_int()の戻り値を別の変数に代入することができますが、学習と可読性のために変数の型を文字列からintに再割り当てできるかどうかを知りたいと思います。

+0

いいえ、それはありません可能です(少なくともこれを実現させるための簡単かつ効果的な方法はありませんか?)。 C++はコンパイル時に任意の変数型を修正します。 –

+0

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

+0

言語が静的に同じではないことに注意してください強く型付けされるように型付けされています。例: JavaScriptは動的で弱く、暗黙の型変換(x = "3" + 5など)が可能です。 Pythonは動的で強く、明示的な型変換(x = "3" + "5"またはx = 3 + 5ですが、混在しない)が可能です。 C++は静的なので、予期された動作ではないので、簡単な方法はありません(コンパイル時にxの型を明示的に宣言する必要があります)。 –

答えて

2

これを可能にするC++言語自体には何もありません。変数は型を変更することはできません。しかし、このようなboost::anyboost::variantとして、そのデータが動的にタイプを変更することを可能にするラッパークラスを使用することができます(C++ 17 std::anystd::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

私は、 'boost ::: get'、つまり3 x': 'はtypoですか? –

+0

OK、テンプレートマジックは可能ですが、ISTMはそれを組み込んだ言語ほど便利ではありません。boost :: get'や 'boost :: any_cast'のような醜いキャスト的な変換、 'boost :: variant'の宣言は少し厄介な、IMOに見えるようにします。 –

+0

@RudyVelthuこれはテンプレートマジックでは動作しません。同じロジックをテンプレートなしでも実行できます。 'any'は基本的に値を保持する動的に割り当てられたデータブロックへのポインタを保持します。異なる値タイプを割り当てると、新しいブロックが割り当てられます。 'variant'は基本的に型セーフな共用体です。 –

2

これはできません。 C++は静的型言語であり、型は変更できません。これは自動または他の方法では機能しません。 intには別の変数を使用する必要があります。 C++ 11以降では、あなたが行うことができます:

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

または:

int i = return_int(str); 

をあなたは私に言わせればとにかく、整数 "文字列" を呼び出すと、少し奇妙です。