【问题标题】:Is there any way to declare the name of the variable then the type有什么方法可以声明变量的名称然后是类型
【发布时间】:2013-03-10 12:51:28
【问题描述】:

我允许用户选择他想使用的数据类型,例如,如果他想使用 long 或 double 等。 我想先声明变量的名称,然后设置它的类型。在 C++ 中可以吗?

【问题讨论】:

  • 如果我理解正确,那么在 C++ 世界中是不可能的。
  • 类型是编译时构造。它们在您的程序编译后并不真正存在,并且无法在运行时更改。
  • 为什么需要这样做?为什么不在用户做出选择后创建一个适当类型的变量呢?你能澄清一下吗?
  • @TylerM。 Java中是否有类似Number类的东西,它是任何数字(包括Double和Integer)的超类型?我不能保证它给出了 10 倍的代码。
  • @RobertKilar 是的,boost::variantVARIANT 几乎可以做到这一点。

标签: c++ types casting void


【解决方案1】:

如果我正确理解了你的问题,你想这样做:

declare variable;

// in the program:
variable = (int) anotherVariable;

简答:

没有

长答案:

a void * 正是这样做的,它需要在取消引用之前显式转换为不同的类型。但这对于不是 void *s 的变量是不可能的。

void *variable = NULL;
int someIntVariable = 100;
int *someIntPointer = NULL;
variable = &someIntVariable;
someIntPointer = (int *)variable;
.. // but this seems unncessary.

【讨论】:

    【解决方案2】:

    查看boost::variant,或者,如果您只需要 POD,请查看 union。但是请记住,这会使许多事情复杂化。

    【讨论】:

      【解决方案3】:
      enum VariantType {
         USER_INT, USER_DOUBLE
      };
      
      union Variant {
         int i;
         double d;
      }
      
      int main() {
         VariantType type;
         Variant data;
         type = getUserDataType();
         switch(type) {
         case USER_INT:
            data.i = 42;
            break;
         case USER_DOUBLE:
            data.d = 42.0;
            break;
         default:
            break;
      }
      

      ...或者使用一些现成的 Variant 实现。

      【讨论】:

        【解决方案4】:

        考虑在其他平台上使用VARIANT(如果您在 Windows 上)或类似的东西。 VARIANT 的要点在于它是一个联合,能够存储各种数据类型,但在给定时间只能存储一种特定类型。通过这种方式,您可以提前定义一个新的泛型变量类型 (VARIANT),然后根据用户的选择在运行时调整其内部类型。

        不过,使用VARIANT 之类的东西是有代价的,因为您对其执行的每个操作都必须检查该操作对于当前基础类型是否正确。 VARIANT 也使用更多的内存,因为联合有自己的开销(详见定义)。

        您可能希望将变体操作包装在一个类中以简化其使用。 VARIANTvoid* 相比的好处在于它为您提供了更多的类型安全性,并且代码变得更具可读性。

        编辑:正如另一个答案指出的那样,boos::variant 就是为了这个目的。

        【讨论】:

          猜你喜欢
          • 2014-05-11
          • 1970-01-01
          • 2022-08-19
          • 2017-04-30
          • 2021-02-24
          • 1970-01-01
          • 2014-05-15
          • 2011-03-06
          • 2018-03-15
          相关资源
          最近更新 更多