在if / else语句中声明可以具有不同类型的变量

时间:2017-06-26 13:14:43

标签: c++

我想在给定if / else条件的情况下选择变量的类型。例如:

if (something){
  int a = 5;
}
else{
  float a = 5;
}

问题是,一旦if / else块完成,a将超出范围。我无法在全球范围内宣布a,因为我事先并不知道这种类型。

有办法吗?

2 个答案:

答案 0 :(得分:3)

我们仍然不知道为什么你想要它,但我能看到的一个解决方案是使用结构,枚举和联合来模拟动态类型。

您可以拥有类似

的结构
struct value
{
    enum
    {
        INT,
        FLOAT
    } type;

    union
    {
        int   i;
        float f;
    } value;
};

这是一些动态类型语言的解释器实现其类型系统的方式。

使用即将推出的C ++ 17标准,您可以使用std::variant代替联合。对于较旧的编译器,还有Boost variant。还有std::any(当然还有Boost any)。

另一种可能的解决方案是使用足够大的字节数组来保存最大类型,并根据需要将数据从数组复制到数组中或从数组复制到正确类型的实际变量中。

另一个可能的解决方案是使用函数重载,并在if中使用所需类型的变量调用(重载)函数,并让函数执行所需的任何操作。其中一个变体是使用单个模板化函数。

使用this comment我真的只看到一种可能的解决方案:继承和多态。

有一个抽象的Interface基类,定义了所需的通用接口(函数)。然后从此抽象基类继承EthernetWiFi类。然后有一个指向基类的指针,指向EthernetWiFi类的实例。

EthernetWiFi类的大多数功能应该非常常见,甚至可以在基类中实现。对于需要特殊WiFi(或Ethernet)操作的情况,然后downcast到具体类。

答案 1 :(得分:0)

您无法在运行时更改/选择真正的变量类型。 C ++是强类型的。所以你可以选择:

  1. 以其他方式模仿逻辑。例如@Some程序员老兄说 - 通过实现一些结构,可以保存不同类型的值。但它有成本 - 你应该总是询问(隐式或显式)实际类型的结构(过多的调用和检查),结构本身将占用更多的内存。还有其他技术。但无论如何,真正的类型与你期望的不同,你会得到一些开销。
  2. 限制您的需求)可以实现这样的逻辑,允许您在编译时基于某些常量表达式选择正确的类型。但在这种情况下,您无法更改没有重新编译的类型。因此,如果您的表达式可以在编译时进行评估,由于性能,强烈建议使用SFINAE模板元编程。这是一个相当大的领域,但这种技术非常有用,所以我建议你去研究它。