如何在C++中"compose"变量名称?

How to "compose" variable names in C++?

本文关键字:compose 变量名 C++      更新时间:2023-10-16

假设如下:

int val1, val2, val3, choice;
while (expression) {
    cin >> choice;
    if (choice == 1) {
        val1 += expression;
    } else if (choice == 2) {
        val2 += expression;
    } else if (choice == 3) {
        val3 += expression;
    } else {
        expressions..;
    }
}

是否有任何方法将变量名视为字符串,以便能够"组合"它们?这在上面的例子中很有用,或者在for循环中更好,将计数器值添加到变量名中,以便在每个循环中调用不同的变量。

有了这样的特性,上面的例子就变成了:
int val1, val2, val3, choice;
while (expression) {
    cin >> choice;
    if (choice == 1 || choice == 2 || choice == 3) {
        ['val' + choice] += expression;
    } else {
        expressions..;
    }
}

我不认为我选择了最好的例子来代表这种特性的好处,无论如何,我曾经在PHP和SQL中做过很多这样的事情,例如在循环中使用计数器的值来每次选择数组的不同项,并在新的SQL语句中声明它。

有谁知道这样的东西在c++中是可能的吗?
如果有什么不清楚的地方就告诉我。
谢谢:)

尝试一个数组:

int vals[3] = {0}, choice;
while (expression) {
    cin >> choice;
    if (choice >= 1 && choice <= 3) {
        // arrays are indexed starting at 0
        vals[choice-1] += expression;
    } else {
        // ...
    }
}

真正的解决方案是一个数组。但是如果你真的想给你的值附加一个不同的名字,你可以使用map:

std::map<std::string, int> vals;
while (expression) {
    cin >> choice;
    if (choice == 1 || choice == 2 || choice == 3) {
        vals[std::string{"val"} + choice] += expression;
    } else {
        expressions..;
    }
}

映射的内容可能看起来像这样:

"val1" -> 4
"val2" -> 3
"val3" -> 12

键中包含字符串的映射将是最接近动态名称的东西。

但是我可以向你保证,在这个特定的情况下,数组解决方案是更好的

动态名称是一个坏主意,如果你想使用c++,请习惯静态名称。

变量名是编译时对象,而不是运行时对象。

当你需要用低整数来标识对象时,使用数组是很常见的。

int val[3]; // val1, val2, val3
// -1 because arrays are 0-based
val[choice-1];

您可以使用散列表(称为unordered_map)对字符串做同样的事情,就像其他人建议的那样。但是unordered_maps是相当重量级的对象。您也可以使用#define和##标记粘贴操作符,但不能粘贴变量。只有编译时标识符可以与##连接。