Список примитивов из вектора строки C

#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 этого не происходит.