c++ - 在 if/else 语句中声明一个可以有不同类型的变量

标签 c++

<分区>

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

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

问题是一旦 if/else block 结束,a 将超出范围。而且我无法在全局范围内声明 a,因为我事先不知道类型。

有办法吗?

最佳答案

我们仍然不太清楚为什么您需要它,但我能看到的一种解决方案是使用结构、枚举和 union 来模拟动态类型。

你可以有这样的结构

struct value
{
    enum
    {
        INT,
        FLOAT
    } type;

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

这就是一些动态类型语言的解释器如何实现他们的类型系统。

对于即将发布的 C++17 标准,您可以使用 std::variant而不是 union 。对于较旧的编译器,还有 Boost variant .还有 std::any (当然还有 Boost any )。

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

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


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

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

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

关于c++ - 在 if/else 语句中声明一个可以有不同类型的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44760629/

相关文章:

c++ - 如何理解 C++ 中的依赖名称

c++ - 在 C++ 中输入大货币值

c++ - C 关于选角的问题

C++ cin.get 在循环之前

c++ - 关于软件许可证

c++ - boost 正则表达式不匹配 "\\s"到空格

c++ - boost::intrusive::unordered_set 桶中使用的是什么存储策略?

c++ - 栈溢出(参数: 0x00000001, 0x00442FF8)

c++ - 为什么在实现链接列表时 "delete at head"不能正常工作?

c++ - 有人知道如何使用 QT 从控制台应用程序启动窗口吗?