Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++编译器,可以将假设调用写入文件,编译它,然后动态链接它作为DLL并尝试运行它。如果参数类型错误,或者函数不存在,则DLL运行时链接失败;否则函数将被调用,您将得到返回值。_C++ - Fatal编程技术网

C++;编译时参数未知的函数调用 如果在运行时访问C++编译器,可以将假设调用写入文件,编译它,然后动态链接它作为DLL并尝试运行它。如果参数类型错误,或者函数不存在,则DLL运行时链接失败;否则函数将被调用,您将得到返回值。

C++;编译时参数未知的函数调用 如果在运行时访问C++编译器,可以将假设调用写入文件,编译它,然后动态链接它作为DLL并尝试运行它。如果参数类型错误,或者函数不存在,则DLL运行时链接失败;否则函数将被调用,您将得到返回值。,c++,C++,听起来不是太奇怪,但是你仍然不能用C++来做。在编译时检查C++函数的签名。最好是将包含函数参数的向量或类似容器传递给函数。即使这样,类型(或者至少是基类,如果使用继承)在编译时必须知道。< P>如果在运行时访问C++编译器,可以将假设调用写入文件,编译它,然后动态链接它作为DLL并尝试运行它。如果参数类型错误,或者函数不存在,则DLL运行时链接失败;否则函数将被调用,您将得到返回值。让您的函数获取一个变量数据类型列表,例如std::vector,并让它们返回一个bool,指示成功或在失败时抛出

听起来不是太奇怪,但是你仍然不能用C++来做。在编译时检查C++函数的签名。最好是将包含函数参数的向量或类似容器传递给函数。即使这样,类型(或者至少是基类,如果使用继承)在编译时必须知道。

< P>如果在运行时访问C++编译器,可以将假设调用写入文件,编译它,然后动态链接它作为DLL并尝试运行它。如果参数类型错误,或者函数不存在,则DLL运行时链接失败;否则函数将被调用,您将得到返回值。

让您的函数获取一个变量数据类型列表,例如
std::vector
,并让它们返回一个
bool
,指示成功或在失败时抛出异常


如果您可以在编译时注册公开的函数,那么您甚至不必对函数施加限制,而是可以为必要的转换生成粘合代码

当然,您可以在运行时这样做。Gdb就是其中之一。但是它需要大量的工作和对目标环境的理解。我想可能有更好的方法来做你想做的事情。

好吧,如果你在机制上灵活,你可以使用动态调度来做这类事情

您要做的是创建一个抽象基类,它有一个“runit”方法返回一个返回值。然后您有一个引擎,它保存指向这个(抽象)基类对象的指针列表,客户机可以通过某种注册调用向您提供这些指针

客户机编写他们自己的“runit”实现,可以做他们需要做的任何事情,只要他们在完成时正确填写引擎的返回值。它们的“自定义参数”作为类版本的额外成员实现,可以在构造对象时填写,也可以通过单独的调用填写


这为您提供了调用他们的例程、运行例程和检查结果所需的功能,而不必知道他们的自定义参数是什么,也不必知道他们的例程的具体功能。

这听起来像是在您的应用程序中包含动态键入脚本语言的一个旁观者。嵌入Lua或Python之类的东西,使脚本语言可以调用您想要的函数。或者,如果您正试图实现这样一个东西,请查看Boost::Python,了解如何实现它的先例。

这是一个毫无意义的问题,因为如果用户(从c代码调用)在编译时不知道参数的类型,他将无法提供正确类型的参数,即使可以构造动态类型的函数指针

甚至在另一个答案中表达的
gdb
示例也假设用户在调用点具有适当的已知类型的变量

由于这是真的,我推断用户确实知道参数的正确类型,这就变成了一个问题,即如何在编译时创建一个函数,该函数接受一组已知类型的参数

这很简单:如果用户有一个
int
和两个
float
并希望得到一个
int
作为回报,并且希望调用假定的函数
swizzle
,其类型因此必须是
int(iif*)(int,int,float)
,那么只需声明此类型的指针,使用
ldload
获取函数
swizzle
,并调用它

但是,您可以实现一些特殊情况,例如,如果所有参数都是指针


请注意,编译时已知包括一些情况,例如模板,其值在编译时根据点和模板实例化时的显式或隐式类型信息推断出来。

在c++ox中使用右值引用如何

template<typename Function>
void FunCall( Function&& f)
{
    f();
}

void Fun_Int(int x)
{
    using std::cout;
    using std::endl;

    cout << "I''m Fun_Int with " << x << endl;
}

void Fun_Str(const string& str1)
{
    using std::cout;
    using std::endl;
    cout << "I'm Fun_Str with " << str1 << endl;

}

void RvaluesDemo()
{
    for (int i = 0; i < 5; i++)
    {
        FunCall([&]
        {
            Fun_Int(i);
        });
    }

    string str = "ABCDEF";

    for (int i = 0; i < str.size(); i++)
    {
       ostringstream os;
       os << str[i];

        FunCall([&]
        {
            Fun_Str(os.str());
        });
    }
}
模板
void FunCall(函数(&f)
{
f();
}
无效乐趣(Int x)
{
使用std::cout;
使用std::endl;

cout有一个名为'libffi'的C库,它允许您在编译时调用具有未知参数和返回类型的函数


知道呼叫是否成功很困难,因为我们的级别太低,计算机基本上假设您所做的是正确的,如果不正确,可能会发生任何事情。有时它会成功,但会给您带来垃圾,有时可能会崩溃,有时可能会出现实际错误。

我认为一个重要的问题是“为什么?”可能有一个更简单的方法。你会一直调用同一个函数吗?或者参数列表选择了要调用的函数吗?是的,这听起来像是你真的想用这个小小的思想实验做些什么。这是什么?你说的“函数调用成功”是什么意思?我无法决定“没有函数”这个原型的名称“或”函数的返回值(无论参数类型是否匹配)为false“请问编译时它是否真的未知,或者您是否打算实现printf之类的函数(您可以随意指定任何参数)Neil Butterworth:你的结论可能是正确的,但是你的推理是错误的。C语言(静态类型)也是一样的,但是有可能使用OP请求使用OP请求的东西。是的,我知道C++没有反射CAPP。