Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中的运行时生成函数指针声明+;?_C++_C++11_Runtime_Function Declaration_Dyncall - Fatal编程技术网

C++ 在C+中的运行时生成函数指针声明+;?

C++ 在C+中的运行时生成函数指针声明+;?,c++,c++11,runtime,function-declaration,dyncall,C++,C++11,Runtime,Function Declaration,Dyncall,是否可以创建/生成类似以下内容的指针声明: void (*foo)(int, float); bool (*foo)(); char (*foo)(char, int); 但在运行时之前不知道参数的类型或返回类型 函数声明将从一个字符串中读取,该字符串将指定返回和参数类型(如果有的话),然后(如果可能的话)存储在C++容器中。 它可以在运行时(而不是编译时)完成吗?如果需要,也可以使用C++11 我真的怀疑这是可以用C++之类的静态类型语言来完成的,但是如果可以做到的话,那么人们会使用什么

是否可以创建/生成类似以下内容的指针声明:

void (*foo)(int, float);

bool (*foo)();

char (*foo)(char, int);
但在运行时之前不知道参数的类型或返回类型

函数声明将从一个字符串中读取,该字符串将指定返回和参数类型(如果有的话),然后(如果可能的话)存储在C++容器中。 它可以在运行时(而不是编译时)完成吗?如果需要,也可以使用C++11

我真的怀疑这是可以用C++之类的静态类型语言来完成的,但是如果可以做到的话,那么人们会使用什么方法。不需要代码(但很感谢),只需要一些必须使用的指导

编辑:


测试了几个想法后,发现它不能直接(C++)实现。幸运的是,我找到了这个库,它允许我(间接地)在相当多的平台上这样做

示例函数:

double sqrt(double x);
double r;
DCCallVM* vm = dcNewCallVM(4096);
dcMode(vm, DC_CALL_C_DEFAULT);
dcReset(vm);
dcArgDouble(vm, 4.2373);
r = dcCallDouble(vm, (DCpointer)&sqrt);
dcFree(vm);
使用dyncall调用函数:

double sqrt(double x);
double r;
DCCallVM* vm = dcNewCallVM(4096);
dcMode(vm, DC_CALL_C_DEFAULT);
dcReset(vm);
dcArgDouble(vm, 4.2373);
r = dcCallDouble(vm, (DCpointer)&sqrt);
dcFree(vm);
字符串也可用于声明函数的结构

C function prototype                                dyncall signature

void f1();                                          ")v"
int f2(int, int);                                   "ii)i"
long long f3(void*);                                "p)L"
void f3(int**);                                     "p)v"
double f4(int, bool, char, double, const char*);    "iBcdZ)d"

你可以这样做

void function (string &arg, …) ;

使用C++的变量参数特性。 你至少需要一个固定的论点


一般来说,你所描述的不是C++中的一个好东西。

< P>它取决于你将处理多少种类型的参数。从技术上讲,你可以在C++中做任何事情,只是有时候它不像你希望的那样简单。 您可以使用代理模式:

class baseDelegate(){};

template<typename retT, typename paramT>
class delegate: public baseDelegate{
    public:
    retT (*ptr)(paramtT);
};

vector<baseDelegate*> yourDelegateList;
classbasedelegate(){};
模板
类委托:公共baseDelegate{
公众:
retT(*ptr)(参数);
};
代表名单;

由于您将主题标记为
C++11
,因此还可以使用
std::function
可变模板等等,以使其更简单。以上代码只是一个示例。

据我所知,这是无法完成的。因此您有一个字符串。您将某些内容存储在以某种方式从该字符串派生的容器中(它不能是声明-这是编译时的概念;您将存储一些对象)。现在怎么办?这个练习的最终目标是什么?你为什么要这样做?有没有可能重新设计您的代码,这样您就不需要这样做?我需要能够生成一个函数指针声明,用于AsmJit,用于一种需要支持简单函数的小型脚本语言。AsmJit可以将生成的代码分配给函数指针,然后可以从c/c++调用函数指针。没有什么普通的C++基本类型。没有任何东西或类似的东西。也许是指针,但除此之外,其他任何东西都不能用于参数。使函数接受变量容器(其中“Variant”是一个可以包含各种类型数据的对象)。是的,但是std::function还需要在编译时定义std::function。我考虑使用它,然后从std::function::target_类型的成员中提取函数定义。只需使用std::make_tuple用我的值构造一个std::tuple,然后使用std::tuple_元素提取元素的类型并使用它们生成std::函数。我稍后会尝试,看看它是否有效,除非其他人提供了一个经验证的解决方案。如果您可以确保作为参数传递的所有类型都是内置的或从一个基类派生的,那么这将更容易做到。在使用委托模式时,必须知道返回类型和参数类型的所有可能组合,但我认为您不能找到任何更灵活的方法。我将不再使用其他任何其他的基本C++数据类型和指针,因此我认为它可能与元组一起工作。更不用说参数号锁定在16。因此,没有超过16个参数和一个返回类型。我只需要构建一个类似于std::vector的容器,它可以容纳多种类型的数据。我将使用您的“从一个基类派生”的思想来实现这一点,并根据容器的大小构造一个std::tuple。希望它真的能起作用:)在测试了几个想法之后,结果证明你不能:(这几乎是不可能的。