【问题标题】:Changing variable types after initialization C++初始化 C++ 后更改变量类型
【发布时间】:2016-07-23 01:04:33
【问题描述】:

我来自 node.js,我想知道是否有办法在 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 以便学习和可读性。

【问题讨论】:

  • 不,这是不可能的(至少在 “一种简单而高效的方式来实现这一点?”)。 C++ 在编译时修复了所有变量类型。
  • 请记住,静态类型的语言与强类型的语言不同。例如:JavaScript 是动态且弱的,它允许隐式类型转换(如 x = "3" + 5)。 Python 是动态且强大的,它允许显式类型转换(x = "3"+"5" 或 x=3+5,但不能混合)。 C++ 是静态的,如前所述,没有简单的方法,因为它不是预期的行为(您必须在编译时显式声明 x 的类型)
  • 另一个方面涉及所谓的匈牙利符号,其中变量本身的名称表示其内容的预期数据类型。这可能会有所帮助,但也可能被视为一种不好的做法,因为它会导致动态语言的混乱以及静态语言的冗余
  • 如果您使用std::variantboost::variant 是可能的,但这意味着您已事先将变量声明为stringint。这通常也是一个可怕的想法。

标签: c++ variables variable-types


【解决方案1】:

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
}

【讨论】:

  • 我认为 boost:::get,即 3 x :,是一个错字?
  • 好吧,使用模板魔法是可能的,但 ISTM 不像内置它的语言那样方便。像 boost::getboost::any_cast 这样丑陋的类转换转换,以及boost::variant 的声明让它看起来有点尴尬,IMO。
  • @RudyVelthuis 不是模板魔法允许它工作。没有模板也可以完成相同的逻辑。 any 基本上持有指向动态分配的数据块的指针,该数据块持有该值。分配不同的值类型会分配一个新块。 variant 基本上只是一个类型安全的联合。
【解决方案2】:

这是不可能的。 C++ 是一种静态类型语言,即类型不能改变。这不适用于自动或任何其他方式。您将不得不为 int 使用不同的变量。在 C++11 及更高版本中,您可以这样做:

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

或者:

int i = return_int(str);

无论如何,如果你问我,调用整数“字符串”有点奇怪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多