c++ 存储函数和参数列表以供以后使用

Gam*_*000 6 c++ multithreading threadpool c++11

所以我想通过用 C++ 编写一个小型线程池来挑战自己,并且我想尝试模仿 std::thread 的易用方式,您可以创建一个线程并作为参数发送一个函数和参数与 pthreads 之类的函数相比,pthreads 强制您将 void* 作为该函数的唯一 indata。

到目前为止,我已经能够使用模板和参数包创建一个函数,该函数可以接受另一个函数和参数并执行它,但我找不到存储它们的方法,以便我可以稍后执行它们(当线程池中有空闲线程时)。我尝试过将 std::function 与 std::tuple 和 std::bind 一起使用,但由于我不确切知道我正在处理什么类型,所以找不到存储函数和参数的方法这样我以后就可以在代码的另一部分使用它们,因为那时我不再知道所有东西的类型。下面是我一直在弄乱的一些代码,可能有助于说明我的意思。

template<typename Function, typename... Arguments>
void TestFunction(Function func, Arguments... parameters)
{

std::function<std::result_of<Function(Arguments...)>::type(Arguments...)>* tempFunc;
tempFunc = new std::function<std::result_of<Function(Arguments...)>::type(Arguments...)>(func);
void* funcPtr = tempFunc;
std::tuple<Arguments...>* tempTuple;
tempTuple = new std::tuple<Arguments...>(parameters...);
void* tuplePtr = tempTuple;

//func(parameters...);
(Arguments...)>*)funcPtr, *(std::tuple<Arguments...>*)tuplePtr);

auto bindTest = std::bind(func, parameters...);
bindTest();
void* bindPtr = &bindTest;

}

int main()
{
TestFunction(std::printf, "%d, %d, %d\n", 3, 2, 1);

getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

可能无法做我想做的事情,在这种情况下,我想我只能切换到更像 pthreads 的方法。但如果有人知道解决办法,我将不胜感激。

use*_*198 2

关键是您可以将 std::bind 的返回类型存储在 std::function 中。因为 std::bind 返回一个可调用的对象。然后,您应该能够根据您想要如何处理返回类型来存储 std::function 实例。

template<typename Function, typename... Arguments>
void TestFunction(Function func, Arguments... parameters)
{
    using Ret = typename std::result_of<Function>::type;
    std::function<Ret()> val{std::bind(func, parameters...)};
}
Run Code Online (Sandbox Code Playgroud)

如果您在第一次接收函数时执行此操作,则不再需要考虑参数类型,而只需考虑返回类型。如何处理返回类型将取决于存储函数的用例。一种简单的方法是要求它Function是一个 void 函数,如果无法将值传递回 API 的使用者,这可能是有意义的。