2016-07-23 32 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); 

无论如何,称一个整数 “串” 是一个有点怪异,如果你问我。