Трудно сказать по вашему вопросу, но, похоже, вы хотите заранее связать аргументы в общий объект Task.
Вы можете просто использовать std::bind()
, который вернет вам стертый тип std::function
обратно с привязанными аргументами или использовать лямбду захвата, т. Е.
#include <iostream>
#include <functional>
void someFunc(const std::string& name, int value)
{
std::cout << name << " " << value << std::endl;
}
int main() {
int count =0;
std::string name("Some name...");
std::function<void()> task = std::bind(&someFunc,name,count );
//alternative without bind is to wrap it in a capturing lambda
std::function<void()> task2 = [=](){ someFunc(name,count); };
task();
task2();
return 0;
}
Демо
Или, если вы хотите использовать свой пример класса задач, что-то вроде этого будет работать ...
#include <iostream>
#include <functional>
class Task {
public:
template <typename Func, typename... Args>
Task(Func&& f,Args&&... args) :
func_([=]()
{ f(args...); })
{}
void execute()
{
func_();
}
private:
std::function<void()> func_;
};
void someFunc(const std::string& name,int count)
{
std::cout << name << " " << count;
}
//Example of wanted use:
int main() {
int counter = 0;
std::string name("Some name...");
Task task(&someFunc,name,counter);
task.execute();
return 0;
}
Демо