它需要一種方法來調用名稱存儲在類似於eval的字符串中的函數。你能幫我嗎?是否有eval(「function(arg1,arg2)」)的C/C++等價物?
回答
C++沒有反射,所以你必須破解它,我。 e .:
#include <iostream>
#include <map>
#include <string>
#include <functional>
void foo() { std::cout << "foo()"; }
void boo() { std::cout << "boo()"; }
void too() { std::cout << "too()"; }
void goo() { std::cout << "goo()"; }
int main() {
std::map<std::string, std::function<void()>> functions;
functions["foo"] = foo;
functions["boo"] = boo;
functions["too"] = too;
functions["goo"] = goo;
std::string func;
std::cin >> func;
if (functions.find(func) != functions.end()) {
functions[func]();
}
return 0;
}
是功能獨立的類嗎?請你詳細說明一下嗎?謝謝 –
'函數'是C++ 11中的新類,它在'功能'頭部。 – Hauleth
非常感謝。我的編譯器無法編譯行std :: map
至少有2個備選方案:
- 的command pattern。
- 在窗口上,您可以使用
GetProcAddress
按名稱獲取回調,並在* nix上使用dlopen
+dlsym
。
請你舉個例子。 –
@DipeshKc我相信你可以很容易地找到一個(兩個替代品)與谷歌。 –
你可以嘗試採用現有的腳本引擎,將你喜歡的函數暴露給這個,然後用它來評估你的語句。一個這樣的發動機可能是V8發動機:https://developers.google.com/v8/intro,但有許多選擇和不同的語言可供選擇。
下面是一些例子:
除了使用該程序的功能,地圖和破解它的Makefile中,可以通過訪問它LF。
我認爲這種方法更好,因爲它不需要編寫重複的代碼,並且每次都在不同的機器上進行編譯。
這裏是我的演示C/C++ equivalent of eval(「function(arg1, arg2)」)
#include<stdio.h>
#include<stdlib.h>
#include<elf.h>
#include<libelf.h>
#include<unistd.h>
#include<fcntl.h>
#include<gelf.h>
#include<string.h>
void my_fun()
{
int a = 19;
printf("my_fun is excute, a is %d \n", a);
}
void my_fun2()
{
printf("my_fun2 is excute\n");
return;
}
void my_fun3()
{
return;
}
void excute_fun(char *program_name, char *function_name)
{
int i, count;
Elf32_Ehdr *ehdr;
GElf_Shdr shdr;
Elf *elf;
Elf_Scn *scn = NULL;
Elf_Data *data;
int flag = 0;
int fd = open(program_name, O_RDONLY);
if(fd < 0) {
perror("open\n");
exit(1);
}
if(elf_version(EV_CURRENT) == EV_NONE) {
perror("elf_version == EV_NONE");
exit(1);
}
elf = elf_begin(fd, ELF_C_READ, (Elf *) NULL);
if(!elf) {
perror("elf error\n");
exit(1);
}
/* Elf32_Off e_shoff; */
/* if ((ehdr = elf32_getehdr(elf)) != 0) { */
/* e_shoff = ehdr->e_shoff; */
/* } */
/* scn = elf_getscn(elf, 0); */
/* printf("e_shoff is %u\n", e_shoff); */
/* scn += e_shoff; */
while ((scn = elf_nextscn(elf, scn)) != NULL) {
gelf_getshdr(scn, &shdr);
if (shdr.sh_type == SHT_SYMTAB) {
/* found a symbol table. */
break;
}
}
data = elf_getdata(scn, NULL);
if(!shdr.sh_entsize)
count = 0;
else
count = shdr.sh_size/shdr.sh_entsize;
for (i = 0; i < count; ++i) {
GElf_Sym sym;
gelf_getsym(data, i, &sym);
char *sym_name = elf_strptr(elf, shdr.sh_link, sym.st_name);
if(sym_name != NULL && sym_name[0] != '_' && sym_name[0] != '\0' && sym_name[0] != ' ' && sym.st_value != 0)
{
/* printf("sym_name is %s\n", sym_name); */
/* printf("%s = %X\n", elf_strptr(elf, shdr.sh_link, sym.st_name), sym.st_value); */
if(!strcmp(sym_name, function_name)) {
void (*fun)(void) = (void*)sym.st_value;
(*fun)();
flag = 1;
}
}
}
if(!flag)
printf("can not find this function\n");
elf_end(elf);
close(fd);
}
int main(int argc, char *argv[])
{
char *input = (char*)malloc(100);
for(;;) {
printf("input function_name to excute: ");
scanf("%s", input);
excute_fun(argv[0], input);
memset(input, 0, sizeof(input));
printf("\n");
}
free(input);
return 0;
}
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
double eval(string expression);
int main(int argc, char *argv[])
{
string expression = "";
for (int i = 1; i < argc; i++)
{
expression = expression + argv[i];
}
cout << "Expression [ " << expression << " ] = " << endl;
eval(expression);
}
double eval(string expression)
{
string program = "";
program = program + "#include <cmath>\n";
program = program + "#include <iostream>\n";
program = program + "using namespace std;\n";
program = program + "int main()\n";
program = program + "{\n";
program = program + " cout << ";
program = program + expression;
program = program + " << endl;\n";
program = program + "}";
ofstream out("abc.cpp");
out << program;
out.close();
system("g++ -o abc.exe abc.cpp");
system("abc");
}
編譯代碼的編譯程序。應該注意,這不適用於所有平臺。 – Mossarelli
- 1. 的JavaScript functionCall(ARG1)(ARG2)
- 2. application.run(宏,ARG1,Arg2)將
- 3. 在jQuery中是否有等價的eval()?
- 4. 是否可以使用`<%=「{0},{1}」,arg1,arg2%>`替換<%= string.Format(「{0},{1}」,arg1,arg2 )%>`在ASP.NET aspx頁面
- 5. 是否有.Net System.Data的Java等價物?
- 6. 是否有Android的Application :: onDestroy()等價物?
- 7. 是否有Python的RedBeanPHP等價物?
- 8. excel vlookup是否有Java的等價物?
- 9. 是否有jQuery.offset的Elm等價物?
- 10. 是否有ToolStripButton的WPF等價物?
- 11. 是否有IConvertible/System.Convert的Java等價物?
- 12. JavaScript的Function.prototype.bind是否有Ruby等價物?
- 13. 是否有Python的Term :: ANSIScreen等價物?
- 14. 是否有「python -i」的ruby等價物?
- 15. Android中是否有MethodHandle的等價物?
- 16. R的h2o.stack是否有python等價物?
- 17. PHP的ArrayObject是否有in_array等價物?
- 18. 是否有Throwable.printStackTrace()的StackTraceElement []等價物?
- 19. apex/Salesforce中是否存在eval()等價物?
- 20. 在Python中是否有sessionInfo()等價物?
- 21. Filehelpers,Super CSV:是否有Python等價物?
- 22. 是否有.gemrc.local或等價物?
- 23. 管道是否有'liftIO`等價物?
- 24. SecCertificateAddToKeychain是否有openssl等價物?
- 25. 在Java中是否有TweenMax等價物
- 26. 在java中是否有array_intersect()等價物?
- 27. TabBarIOS - 是否有viewDidAppear或viewWillAppear等價物?
- 28. 在Doxygen中是否有@inheritDoc等價物?
- 29. 在Python中是否有Rake等價物?
- 30. 是否有一個packaged_task :: set_exception等價物?
不,你最好的選擇是命令模式。 – AraK
如果你願意屈服於qt的力量,是的:http://qt-project.org/doc/qt-4.8/QMetaObject.html – fritzone
有一些C++解釋器:http://stackoverflow.com/questions/69539 /你曾經使用過的任何解釋器-non-compilers/ –