【问题标题】:Access variable value using string representing variable's name in C++ [duplicate]在 C++ 中使用表示变量名称的字符串访问变量值 [重复]
【发布时间】:2011-02-24 01:59:22
【问题描述】:

如果标题不清楚,我会尽量澄清我在问什么:

假设我有一个名为 counter 的变量,我知道我可以通过执行以下操作来查看它的当前值:

std::cout << counter << std::endl;

但是,假设我有很多变量,直到运行时我才知道要查看哪些变量。

有谁知道我可以通过变量名获取变量值的方法,例如:

std::cout << valueOf("counter") << std::endl;

我觉得能够做到这一点可能会使调试大型复杂项目更容易。

提前感谢您的宝贵时间。


更新:提供的所有答案都是有效且有用的,但重点是 C++ 中不存在反射(阅读推荐的链接后,原因很清楚)。

【问题讨论】:

  • compile-time 中知道 counter 字符串吗?
  • 它被称为“调试器”——它允许您在运行时检查变量值,以及其他有用的功能:)
  • 我非常了解调试器和调试,其他答案表明我在询问反射 - 一个我以前不知道的术语......
  • stackoverflow.com/questions/3386861/… 和 for 循环提供帮助。

标签: c++ variables


【解决方案1】:

如前所述,您正在寻找 C++ 中的反射。它没有,this answer 解释了原因。

【讨论】:

    【解决方案2】:

    您可以使用关联容器作为 std::map 将字符串链接到变量,假设它们都是相同的类型。

    如果您有不同类型的变量,则存在解决方案,如 boost::variant

    【讨论】:

      【解决方案3】:

      不,不是 C++ 或其标准库。当然,你可以修改一些东西来模仿这种行为。 C++ 允许您在运行时选择方法,使用多态性,因此您可以利用它。本质上,您将获得在运行时调用的方法,而不是变量,并且该方法将返回值:

      struct Value {
          virtual ~Value();
          virtual std::string value() const = 0;
      };
      
      struct Counter : public Value {
          int v;
          std::string value() const {
              istringstream ss(v);
              return ss.str();
          }
      };
      
      struct Mounter : public Value {
          double v;
          std::string value() const {
              istringstream ss(v);
              return ss.str();
          }
      };
      
      Value* get_value();
      
      // ...
      cout << get_value()->value() << endl;
      

      或者,您可以维护一个以字符串为键的映射、值的名称,然后使用它们的名称查找值。

      【讨论】:

        【解决方案4】:

        C++ 通过地址寻址所有变量,因此无法只说 valueOf 一个变量(允许这样做的语言,例如 python、perl 有一个运行时保存此信息)

        您可以通过将值及其名称存储在 std::map 中来实现允许使用名称来查找值的功能。

        【讨论】:

          【解决方案5】:

          如果你真的想做这样的事情,你可以尝试使用 std::map (map )。但是,这会将您限制为一种变量类型,除非您深入研究一些丑陋的指针魔术。无论哪种方式,它都会很丑陋,相信我,你真的不想走这条路。为什么你甚至需要这样的功能?如果出于调试目的,请使用调试器。

          【讨论】:

            【解决方案6】:

            如前所述,C++ 不提供反射。但是您可以自己使用一些键/值映射。 当只需要一种值类型(例如 int)时,您可以使用开箱即用的 STL 关联容器(映射)。 如果您需要支持多种值类型,我建议您查看 boosts Variant 库。

            【讨论】:

              【解决方案7】:

              这需要类似于反射或评估的东西,而 C++ 没有。

              【讨论】:

                【解决方案8】:

                不,C++ 不提供该功能。你也许可以用宏(或其他诡计)破解某些东西,但它可能相当丑陋。

                既然我想不出有什么好的理由为什么这会有用,也许你可以启发我们。当某事无法以某种方式完成时,最好退回到基本要求,看看是否还有其他方式。

                【讨论】:

                • 这在调试通用算法时非常有用。当泛型算法出现问题时,查看实际类型的名称确实很有帮助。很多时候,调试器不会显示这个。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-09-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多