使用表示C ++中变量名称的字符串访问变量值

时间:2010-05-26 08:56:52

标签: c++ variables

如果标题不清楚,我会尝试澄清我的要求:

想象一下,我有一个名为 counter 的变量,我知道我可以通过以下方式看到它的当前值:

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

但是,假设我有很多变量,我不知道在运行之前我想要查看哪些变量。

有没有人知道我可以通过使用其名称来获取变量值的方法,例如:

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

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

提前感谢您的时间。


更新:所提供的所有答案都是有效且有用的,但主要的一点是C ++中不存在反射(并且在阅读建议的链接后很清楚为什么)。

8 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

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;

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

答案 3 :(得分:1)

C ++通过地址解决所有变量,所以没有办法只说valueOf一个变量(允许这样的语言,例如python,perl有一个运行时保存这个信息)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

如上所述,C ++没有反映。但您可以自己使用一些键/值映射。 如果只需要一个值类型(例如int),则可以使用开箱即用的STL关联容器(映射)。 如果您需要支持多种值类型,我建议您查看boost Variant库。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

不,C ++没有提供这种功能。你可能能够与宏(或其他技巧)一起破解某些东西,但它可能相当难看。

因为我认为没有充分的理由为什么这会有用,或许你可以启发我们。当某些事情无法以某种方式完成时,回到基本要求并查看是否有其他方法通常是好的。