#c
#c
Вопрос:
Я искал этот ответ в течение недели. Я не нашел решения. Я хотел бы знать, возможно ли объявить имя примитива из вектора строк. Это означает, что если у меня есть класс, который принимает строку, помещает ее обратно в вектор строк, я хочу затем объявить примитив float с именем каждой строки.
vector<string> myVec;
Test::setCoordinate(string amp;myStr){
myVec.push_back(myStr);
}
Теперь я хотел бы, чтобы каждое имя было контейнером для переменной типа float.
Комментарии:
1. Что вы подразумеваете под «примитивами»?
2. Создание динамической переменной (если это то, что вы пытаетесь сделать) — плохая, беспорядочная идея. Это редко, если вообще когда-либо необходимо.
3. Может быть,
std::map<std::string, float>
это то, что вы ищете?4. Значения, которые я хочу вызвать, хранятся в виде дерева и заранее не известны
Ответ №1:
Нет, это невозможно. В C отсутствуют какие-либо функции динамической генерации кода, которые позволяли бы присваивать переменным имена из данных времени выполнения, таких как строки.
Самое близкое, что вы можете получить, это что-то вроде:
std::map<std::string, float> values;
values["f1"] = 0.3;
values["f2"] = 0.6;
Комментарии:
1. Подождите, с каких это пор исключение
f
как в0.3f
не выдает предупреждения?2. Это литерал типа
double
, зачем ему предупреждать?3.
double
сохраненный вfloat
элемент может вызвать сужение, не так ли?4. @GillBates: Это (обычно) преобразование с сужением. Предупреждает ли компилятор об этом … ну, вероятно, нет, по крайней мере, когда вы используете плавающий литерал, который находится в пределах диапазона, который может быть представлен как значение с плавающей точкой (как в данном случае). Предупреждение было бы более вероятным, если бы вы попытались назначить что-то вроде
1e100
, что обычно вообще не помещается вfloat
a.5. Преобразования сужения не требуют диагностики, за исключением случаев, когда они выполняются внутри списков инициализации. Конечно, вы можете увеличить уровни предупреждения (например, с
-Wconversion
), чтобы предупредить об этом, но ответ на «с каких пор исключение f, например, в 0.3f, не выдает предупреждения?» заключается в том, что по умолчанию это никогда не выполняется. Даже при-Wall -Wextra
использовании GCC или Clang этого не происходит.