nó cần một cách để gọi hàm có tên được lưu trữ trong một chuỗi tương tự như eval. Bạn có thể giúp?Có tương đương C/C++ của eval ("hàm (arg1, arg2)") không?
Trả lời
C++ không có phản ánh để bạn phải hack nó, i. 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;
}
là một lớp học riêng biệt? Xin bạn có thể xây dựng? Cảm ơn –
'function' là lớp mới trong C++ 11 trong tiêu đề' functional'. – Hauleth
Cảm ơn rất nhiều. Trình biên dịch của tôi không thể biên dịch các dòng std :: map
Có ít nhất 2 lựa chọn:
- Các command pattern.
- Trên cửa sổ, bạn có thể sử dụng
GetProcAddress
để gọi lại theo tên vàdlopen
+dlsym
trên * nix.
bạn có thể cho một ví dụ hay không. –
@DipeshKc Tôi chắc chắn bạn có thể dễ dàng tìm thấy một (cho cả hai lựa chọn thay thế) với google. –
Bạn có thể thử áp dụng công cụ tạo tập lệnh hiện có, hiển thị các chức năng bạn thích và sau đó sử dụng hàm này để đánh giá các câu lệnh của bạn. Một động cơ như vậy có thể là động cơ V8: https://developers.google.com/v8/intro nhưng có nhiều lựa chọn thay thế và các ngôn ngữ khác nhau để bạn lựa chọn.
Dưới đây là một số ví dụ:
Trừ bằng cách sử dụng bản đồ chức năng trong chương trình và hack nó trên Makefile, bạn có thể truy cập thông qua E LF.
Tôi nghĩ rằng phương pháp này là tốt hơn vì nó không cần phải viết mã trùng lặp và biên dịch nó mỗi lần trên máy khác nhau.
Dưới đây là bản demo của tôi 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;
}
thực hiện này được dựa trên Example of Printing the ELF Symbol Table
#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");
}
Một chương trình biên dịch biên dịch mã. Nên lưu ý rằng điều này không hoạt động trên tất cả các nền tảng. – Mossarelli
- 1. Có hợp lệ để sử dụng `<% =" {0}, {1} ", arg1, arg2%>` thay cho `<% = string.Format (" {0}, {1} ", arg1, arg2)%> `trong trang aspx ASP.NET
- 2. Tương đương eval() trong Groovy
- 3. Có tương đương Python của hàm conv2 của MATLAB không?
- 4. Tương đương với Unix eval trong Windows
- 5. PHP: Tương đương của bao gồm sử dụng eval
- 6. Bash eval replace $() không phải lúc nào cũng tương đương?
- 7. Có hàm eval() trong Java không?
- 8. Có hàm PHP tương đương với Python os.path.normpath() không?
- 9. Ruby Sequel có tương đương với hàm SQL "coalesce" không?
- 10. Có tương đương Java của SignalR không?
- 11. Tương đương C++ của hàm băm_hmac của PHP là gì?
- 12. Có tương đương trong C++ của hàm explode() của PHP không?
- 13. GNU tạo 3,81: hàm eval không hoạt động?
- 14. Tương đương của Lisp tương đương với \ r bên trong hàm định dạng?
- 15. ArrayObject của PHP có tương đương in_array không?
- 16. Có tương đương lua của javascript áp dụng() không?
- 17. Mathematica có hàm tương đương với hàm "duy nhất" của Matlab
- 18. PostgreSQL tương đương với hàm PERCENTILE_CONT của Oracle
- 19. Tương đương với hàm lambda của Python trong Java?
- 20. Nguyên mẫu tương đương với hàm gần nhất của jQuery
- 21. Ruby tương đương với hàm ucfirst() của PHP
- 22. Python tương đương với hàm "ismember" của MATLAB
- 23. Có bất kỳ Java tương đương với hàm http_build_query của PHP không?
- 24. Tương đương 3D của hàm đường cong trong R?
- 25. Có tương đương Javascript của andand của Ruby không?
- 26. Có "\ n" tương đương trong VBScript không?
- 27. Dojo tương đương với hàm jQuery.text?
- 28. jquery có tương đương với dojo.hitch() không?
- 29. Tương đương TreeSet của Java tương đương với Python?
- 30. Javascript eval() cho hàm có đối số
Nope, đặt cược tốt nhất của bạn là mô hình lệnh. – AraK
Nếu bạn sẵn sàng cúi đầu trước sức mạnh của qt, có: http://qt-project.org/doc/qt-4.8/QMetaObject.html – fritzone
Có một số phiên dịch C++: http://stackoverflow.com/questions/69539/have-you-used-bất kỳ-of-the-c-interpreters-not-compilers/ –