将任何类型的函数作为参数的构造函数
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
- 它毕竟不是那里的直接调用。
代码用途: 我需要能够将任何函数类型作为参数提供给构造函数,以便我可以从内部调用它 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
- 它毕竟不是那里的直接调用。