прямой вызов из каких пользовательских входов и существует ли концепция генерации функции во время выполнения? - PullRequest
0 голосов
/ 23 декабря 2011

Есть ли выход для вызова функции непосредственно из того, что вводит пользователь?

Например: если пользователь вводит greet, вызывается функция с именем greet.

Я не хочу генерировать какие-либо случаи или сравнения для вызова.

#include <iostream>
#include<string>
using namespace std;

void nameOfTheFunction(); // prototype

int main() {
string nameOfTheFunction;

getline(cin,nameOfTheFunction);  // enter the name of Function

    string newString = nameOfTheFunction + "()"; // !!!

cout << newString;

// now call the function nameOfTheFunction

}

void nameOfTheFunction() {
cout << "hello";
}

И существует ли концепция генерации функции во время выполнения?

Ответы [ 3 ]

2 голосов
/ 23 декабря 2011

Вы имеете ввиду генерацию функции времени выполнения ??

NO.

Но вы можете использовать карту, если вы уже знаете, какие строки пользователь может ввести в качестве входных данных (т. Е. Вы ограничиваете входные данные).

Для вышеперечисленного вы, вероятно, можете использовать std::map &lt std::string, boost::function &lt... &gt &gt

Проверьте повышение :: функция ЗДЕСЬ

0 голосов
/ 23 декабря 2011

Генерация функции во время выполнения имеет много недостатков (если это вообще возможно), и, как правило, нет веских причин делать это на языке, подобном C ++.Вы должны оставить это для языков сценариев (таких как Perl или Python), многие предлагают функцию eval(), которая может интерпретировать строку как код сценария и выполнять ее.

Если вам действительно нужно что-то вродеeval() на скомпилированном языке, таком как C ++, у вас есть несколько вариантов:

  1. Определите свой собственный язык сценариев и напишите для него синтаксический анализатор / интерпретатор ( много работы)
  2. Определите очень простой императивный или математический язык, который можно легко анализировать и оценивать с использованием известных шаблонов проектирования (например, Interpreter)
  3. Используйте существующий язык сценариев, который можно легко интегрировать в ваш кодчерез библиотеку (пример: Lua)
  4. Заполните строки кода, которые вы хотите выполнить во время выполнения через внешний интерпретатор или компилятор, и запустите их через операционную систему или загрузите их в вашу программу, используя dlopen / LoadLibrary / etc.

(3.), Вероятно, самый простой и лучший подход.Если вы хотите свести к минимуму внешние зависимости или если вам нужен прямой доступ к функциям и состоянию внутри вашей основной программы, я предлагаю вам перейти к (2.) Обратите внимание, что в этом случае вы можете иметь обратные вызовы в свой собственный код, поэтомувызов собственных функций из скрипта не является проблемой. Смотрите здесь учебник

Если вы можете выбрать язык, такой как Java или C #, есть также возможность использовать компилятор, встроенный в саму среду выполнения. Посмотрите здесь, как это сделать в Java

0 голосов
/ 23 декабря 2011

Короче, нет, это невозможно.Имена в C ++ превращаются в смещения памяти (адреса), а затем имена отбрасываются **.Во время выполнения C ++ не знает об именах функций или методов, которые он на самом деле выполняет.

** Если символы отладки скомпилированы, то символы есть, но получить доступ к ним нецелесообразно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...