2016-09-02 2 views
2

Назначение кода: Мне нужно иметь возможность комбинировать любой тип функции в качестве параметра конструктора, чтобы я мог вызвать его изнутри этого класса.Конструктор, который будет принимать любые функции в качестве параметра

Почему это должно быть так? Потому что я использую Unreal Engine 4FRunnable Threading, который выполняется таким образом, что поток будет вызывать конкретные интерфейсы (функции виртуальных членов) для запуска потока, поэтому, если я не хочу создавать новый класс для каждого потока задача, которую я хотел бы назначить, мне нужно попробовать и передать ее общие функции, чтобы я мог обладать максимальной функциональностью из моего класса Threading.

Для чего я использую класс нитей?SQLite3 запросов, для каждого запроса, требующего сохранения данных, всегда требуются разные параметры, где в качестве моих SELECT запросов.

Это мой код ниже, первая часть работает нормально, но второй конструктор не работает;

класс резьбы конструктор

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); 
} 

Любая помощь будет высоко оценена как я застрял в этом вопросе на некоторое время, и теперь, даже дизайн предложения/изменения будут более приглашены.

Спасибо за ваше время.

ответ

1

Как вы выяснили с помощью std::bind, вы действительно не можете передать какую-либо случайную функцию - как бы FThreading умеет ее называть? Существует фактическая команда вызова funcTask();, которая немедленно сообщает нам, что funcTask не принимает никаких аргументов.

Теперь в вашей второй перегрузке funcTask принимает два аргумента FString. Очевидно, что это означает, что есть бессмыслица. Просто отсутствуют оба аргумента. Мы не можем придумать эти аргументы для вас.

Это общая проблема с идеей в вашем названии, «использовать любой тип функции в качестве параметра». Как правило, это происходит не потому, что невозможно передать какую-либо функцию, а потому, что невозможно вызвать эту функцию.

PS. boolTwoString = funcTask(); должно быть всего boolTwoString = funcTask - это ведь не прямой звонок.

+0

Спасибо, что нашли время, чтобы ответить. Знаете ли вы, как я мог обойти эту проблему? Некоторое время это был колючий сон. –

+0

@NullByte: Как я уже сказал, мы понятия не имеем, как ваш поток должен придумать эти два строковых аргумента. Просто чтобы проверить, не делаете ли вы глупых предположений: 'ExecSql' принимает 4 строковых аргумента, не так ли? Поскольку вы связали два аргумента и, по-видимому, оставили два несвязанных аргумента строки. – MSalters

+0

С вашим советом мне удалось заставить его работать, спасибо за ваше время, помогая мне, я действительно ценю это –

Смежные вопросы