C 商店功能和参数列表,供以后使用

c++ store function and parameter list for later use

本文关键字:列表 功能 参数      更新时间:2023-10-16

所以我想通过在C 中编写一个小线池来挑战自己,我想尝试模仿STD :: thread与之使用的易于使用的方式,您可以创建它与诸如pthreads之类的内容相比,线程和参数发送该功能的函数和参数,这些函数迫使您将void*作为函数的唯一INDATA。

到目前为止以后的时间(当线程池中有一个免费线程时(。我尝试使用两个std ::函数与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, %dn", 3, 2, 1);
getchar();
return 0;
}

可能是不可能做我想做的事,在这种情况下,我想我只需要更改更像Pthreads的方法。但是,如果有人知道解决问题,我会很感激。

关键是您可以存储std ::的返回类型bind bint a在std ::函数中。因为std :: bind返回一个可呼叫的对象。然后,您应该能够根据要处理返回类型的方式存储std ::功能实例。

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

如果您在第一次恢复功能时执行此操作,则不再需要考虑参数类型,而仅考虑返回类型。如何处理返回类型将取决于存储函数的用户酶。一种简单的方法是要求Function是一个空隙函数,如果没有办法将值传递给API的消费者。

,这可能是有道理的。