将任何类型的函数作为参数的构造函数

Constructor that will take any type of function as a parameter

代码用途: 我需要能够将任何函数类型作为参数提供给构造函数,以便我可以从内部调用它 class .

为什么一定要这样?因为我用的是Unreal Engine4完成的 FRunnable 线程是这样一种方式,即线程将调用特定接口(虚拟成员函数)到 运行 线程,所以除非我想为每个线程创建一个新的 class我想分配的任务,我必须尝试为它提供通用函数,以便我可以从我的线程中获得最大的功能 class.

我使用线程class做什么? SQLite3查询,每个需要保存数据的查询总是需要不同的作为我的 SELECT 查询的参数。

这是我下面的代码,第一部分工作正常但第二个构造函数没有;

线程class构造函数

FThreading::FThreading(std::function<void()> funcTask) {

    //Check if the Thread has not been defined and that the system supports multi threading
    if (!Thread && FPlatformProcess::SupportsMultithreading()) {

        //Create our thread
        voidNoParaFunc = funcTask;
        curFlag = 1;
        Thread = FRunnableThread::Create(this, TEXT("FThreading"), 0, TPri_BelowNormal);

    } else {

        //Can't multithread, call the function straight
        funcTask();

    }
}

来电:

std::function<void()> passFunc = std::bind(&UCP_GameInstance::InitDB, GameInst);
FThreading* threadPointer = new FThreading(passFunc);

现在这是我需要帮助的无法运行的代码:

FThreading::FThreading(std::function<bool(FString, FString)> funcTask) {

    //Check if the Thread has not been defined and that the system supports multi threading
    if (!Thread && FPlatformProcess::SupportsMultithreading()) {

        //Create our thread
        boolTwoString = funcTask();
        curFlag = 2;
        Thread = FRunnableThread::Create(this, TEXT("FThreading"), 0, TPri_BelowNormal);

    }
    else {

        //Can't multithread, call the function straight
        funcTask();

    }
}

来电:

void UCP_GameInstance::AddNewSurvivor(FString First, FString Second, FString Nation, FString Age, FString Blood, FString Level, FString Spec) {

FString Query = "INSERT INTO SurvivorData (First, Second, Nation, Age, Blood, Level, Spec) " +
    "VALUES (" + First + ", " + Second + ", " + Nation + ", " + Age + ", " + Blood + ", " + Level + ", " + Spec + ");";

std::function<bool(FString, FString)> passFunc = std::bind(&USQLiteDatabase::ExecSql, GetDBName(), Query);
FThreading* threadPointer = new FThreading(passFunc);
}

任何帮助将不胜感激,因为我已经在这个问题上停留了一段时间,现在,即使是设计 suggestions/changes 也会受到更多邀请。

感谢您的宝贵时间。

正如您对 std::bind 的理解,您不能真正传递任何随机函数 - FThreading 怎么知道如何调用它?有一个实际的调用指令 funcTask(); 立即告诉我们 funcTask 没有参数。

现在,在您的第二次重载中,funcTask 接受两个 FString 参数。显然,这意味着 funcTask(); 调用是无稽之谈。它只是缺少两个参数。我们无法为您发明这些论点。

这是您标题中想法的普遍问题,"take any type of function as a parameter"。它通常会失败,不是因为无法传递任何函数,而是因为无法调用该函数。

PS。 boolTwoString = funcTask(); 应该只是 boolTwoString = funcTask - 它毕竟不是那里的直接调用。