Неужели невозможно превратить строку в переменную в С++

Как Преобразовать строку в имя переменной или тип переменной, так и Как использовать строку в качестве имени переменной в C++? ответы говорят, что вы не можете использовать строку в качестве переменной после времени компиляции. Однако они упоминают, что языки более высокого уровня, такие как python, могут. Насколько я понимаю, Python написан на C из этого https://softwareengineering.stackexchange.com/questions/20988/why-is-python-writer.

Итак, если Python написан на C и может использовать строку в качестве переменной, то почему люди не могут сделать это на C++?

Думаю вопрос не ясен. Судя по аналогиям в комментариях

Если Python сделан из C, я бы предположил, что написана какая-то функция, которая позволяет Python быть динамичным. Так почему же эту функциональность нельзя написать без всех остальных частей Python?


person user-2147482637    schedule 01.08.2014    source источник
comment
пожалуйста, изучите разницу между языком со статической типизацией и языком с динамической типизацией.   -  person Bryan Chen    schedule 01.08.2014
comment
@BryanChen, если python написан на C, то почему нельзя реализовать функциональность динамически типизируемой строки   -  person user-2147482637    schedule 01.08.2014
comment
Вы можете сохранить таблицу адресов переменных с их строковыми версиями, а затем найти строку в этой таблице, чтобы найти переменную.   -  person M.M    schedule 01.08.2014
comment
@user1938107 user1938107 Тот факт, что язык A написан на языке B, не означает, что язык B является надмножеством языка A. Вполне вероятно, что я могу написать компилятор C++, используя старый, не-OO Visual Basic. Еще лучший пример — некоторые компиляторы C++ написаны на C. Есть ли в C виртуальные функции или шаблоны?   -  person PaulMcKenzie    schedule 01.08.2014
comment
Итак, если Python написан на C и может использовать строку в качестве переменной, то почему люди не могут сделать это на C++? -- Дом из кирпича. Кирпичи можно складывать. Так почему же дома нельзя складывать?   -  person Jim Balter    schedule 01.08.2014
comment
Люди состоят из клеток. Клетки мелкие. Так почему же люди не маленькие?   -  person Jim Balter    schedule 01.08.2014
comment
Фортран использовался для управления ранними космическими кораблями. Так почему же Фортран не может вращаться вокруг Земли?   -  person PaulMcKenzie    schedule 01.08.2014
comment
Каждый язык программирования выполняется как машинный код. Поэтому все языки программирования должны быть одинаковыми. пожалуйста, имейте здравый смысл.   -  person Bryan Chen    schedule 01.08.2014
comment
@BryanChen - Хороший общий момент. Любой компьютерный язык может быть написан на низкоуровневом ассемблере.   -  person PaulMcKenzie    schedule 01.08.2014
comment
на самом деле вопрос -- Нет, вопрос в том, почему язык программирования не имеет какого-либо атрибута языка программирования, на котором он был написан. Ответ заключается в том, что нет необходимой связи между атрибутами языка программирования и атрибутами реализованного в нем языка программирования.   -  person Jim Balter    schedule 01.08.2014
comment
@JimBalter Нет, дело не в том, почему язык программирования не имеет какого-либо атрибута языка программирования, на котором он был написан, вопрос в том, если язык программирования произошел от другого, почему люди говорят, что невозможно реализовать одну и ту же функцию с оригинальным языком   -  person user-2147482637    schedule 01.08.2014
comment
К редактированию, которое вы внесли в свой вопрос, вы можете реализовать функциональность строк в качестве имен переменных, вы можете получить эквивалент, вы просто не можете расширить синтаксис C или C++, чтобы сделать это.   -  person Keith Nicholas    schedule 01.08.2014
comment
Нет, это не так. Да, это так. Я программировал почти 50 лет, а вы программировали на что, день?   -  person Jim Balter    schedule 01.08.2014
comment
@JimBalter Нет, это не относится к тому, что вы утверждаете, в чем заключается мой вопрос, а поскольку это мой вопрос, я знаю, что хочу спросить. Если не понятно, то редактирую.   -  person user-2147482637    schedule 01.08.2014
comment
почему люди говорят, что невозможно реализовать ту же функцию на исходном языке? Никто этого не говорил. Вы сбиты с толку и ведете себя так, как будто знаете лучше, чем люди, гораздо более опытные и осведомленные, чем вы.   -  person Jim Balter    schedule 01.08.2014
comment
Ваш вопрос тот, который вы задали, а не тот, который хотели задать... мы не телепаты.   -  person Jim Balter    schedule 01.08.2014
comment
реализовать ту же функцию с исходным языком - возможность использовать строки в качестве имен переменных является особенностью языка, а не функцией, реализованной в языке. Ответ Кубы Обера ниже показывает, как вы можете получить ту же функциональность, но он не использует строки в качестве имен переменных.   -  person Jim Balter    schedule 01.08.2014
comment
@JimBalter Да, извините. я имел в виду функциональность   -  person user-2147482637    schedule 01.08.2014
comment
Так почему же эту функциональность нельзя написать без всех остальных частей Python? -- Можно, и никто никогда не говорил, что нельзя. Ваш вопрос полностью основан на вашем собственном непонимании и действительно должен быть удален. Я имел в виду функциональность - зачем тогда тег времени компиляции?   -  person Jim Balter    schedule 01.08.2014
comment
@JimBalter да, я могу удалить, если ты так думаешь   -  person user-2147482637    schedule 01.08.2014
comment
Вопрос, на который вы, по-видимому, хотите получить ответ: можете ли вы сопоставить строку со значением в C++? Ответ, безусловно, да, и некоторые из приведенных ниже ответов показывают, как это сделать.   -  person Jim Balter    schedule 01.08.2014
comment
Этот вопрос действительно должен был быть помечен как дубликат одного из тех, на которые ссылается ОП, поскольку ответы на эти вопросы охватывают все проблемы здесь.   -  person Jim Balter    schedule 01.08.2014


Ответы (4)


Реализация CPython — реализация Python, написанная на C — использует язык C для реализации определенного вида поиска переменных, который заставляет Python вести себя как Python, а не как, скажем, C или BASIC.

Таким образом, вы, безусловно, можете использовать C или C++ для реализации поиска переменных со строковыми именами. Просто не ждите, что компилятор распознает его, потому что он не является частью языка C/C++. Однако конечный продукт — скомпилированный исполняемый файл — будет поддерживать эту концепцию.

Например, в C++ с помощью Boost:

std::map<std::string, boost::variant<std::string, int>> _;

_["name"] = "user";
_["index"] = 1938107;

std::cout << _["name"] << _["index"] << std::endl;

Вывод:

user1938107

Вы также можете заставить его взаимодействовать с обычными переменными, известными компилятору, если нет готовых классов, которые могли бы вам в этом помочь.

person Kuba hasn't forgotten Monica    schedule 01.08.2014

Когда программа C++ компилируется, имена переменных не помещаются в результирующий исполняемый файл. Как только компилятор во всем разобрался, они буквально отбрасываются. Все, что осталось, — это очень низкоуровневые фрагменты инструкций на языке ассемблера и адреса памяти. Таким образом, язык в основном спроектирован таким образом, что не позволяет вам делать то, что вы хотите.

Некоторые другие языки, такие как Python, сохраняют информацию об имени. Они не компилируются так же, как C++. Обычно во время выполнения происходит гораздо больше интерпретаций. На каком-то фундаментальном уровне переменные в программе Python, вероятно, оказываются в какой-то базовой структуре данных — возможно, в виде сопоставления имен со значениями. Таким образом, язык может поддерживать поиск на лету и т.п. имен переменных.

Таким образом, в лучшем случае на C++ вы можете создавать свои собственные структуры данных или инфраструктуру аналогичным образом — хранить данные с соответствующим именем, а затем иметь возможность запрашивать по имени для получения соответствующих данных. (Или, конечно, вы можете поискать кого-то еще, кто уже реализовал такую ​​вещь.)

person TheUndeadFish    schedule 01.08.2014

Шуруповертом дырку не просверлишь. Но вы можете использовать отвертку, чтобы построить дрель.

person David Schwartz    schedule 01.08.2014
comment
Я не уверен, что это ответ. - person Jonathan Leffler; 01.08.2014
comment
Я просверлил отверстия отверткой... ; ) - person polarysekt; 01.08.2014

По-другому, я думаю, вы МОЖЕТЕ создать ТИП переменных из строки или чего-то еще, используя какой-то трюк, например, в шаблоне проектирования Factory, но это не языковая функция, вам нужно будет сначала зарегистрировать имя типа и функцию создателя типа .

std::map<string, creating_function> lookup_table;
lookup_table["class_1"] = &class_1_creator;  // register type and creator

obj_instance& Create(string type_name, parameters_passed_to_the_creator) // create a variable
{
    return lookup_table[type_name](parameters_passed_to_the_creator);
}
person dguan    schedule 01.08.2014