2016-07-23 76 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':',是一個錯字? –

+0

好的,模板魔法是有可能的,但ISTM不像內置語言那麼方便。像'boost :: get'和'boost :: any_cast'這樣醜陋的類似轉換的轉換,以及「boost :: variant」的聲明使它看起來有點尷尬,IMO。 –

+0

@RudyVelthuis它不是模板的魔法,它可以讓它工作。沒有模板就可以完成相同的邏輯。 'any'基本上持有一個指向保存該值的動態分配數據塊的指針。分配不同的值類型分配一個新塊。 'variant'基本上只是一個類型安全的聯合。 –

2

這是不可能的。 C++是一種靜態類型語言,即類型不能改變。這不適用於汽車或任何其他方式。您將不得不爲int使用不同的變量。在C++ 11和更新,你可以這樣做:

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

或者:

int i = return_int(str); 

無論如何,稱一個整數 「串」 是一個有點怪異,如果你問我。