c++存储函数和参数列表供以后使用
Posted
技术标签:
【中文标题】c++存储函数和参数列表供以后使用【英文标题】:c++ store function and parameter list for later use 【发布时间】:2017-04-18 22:40:23 【问题描述】:所以我想通过在 C++ 中编写一个小型线程池来挑战自己,并且我想尝试模仿 std::thread 使用的易于使用的方式,您可以创建一个线程并作为参数发送一个函数和该函数的参数,与 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;
可能是不可能做我想做的事,在这种情况下,我想我只需要切换到更像 pthreads 的方法。但如果有人知道解决方法,我将不胜感激。
【问题讨论】:
你试过 lambdas 吗?它可以存储函数调用和参数,没有任何问题。 @MichaelNastenko 我已经研究过它们,但如何在一般意义上存储它们的问题也适用于它们 您可以在 lambda 中使用std::packaged_task
,它会负责存储参数和返回值。
@MichaelNastenko 通过查看 std::packaged_task 的一些文档,我认为它不会解决我的问题。将我的参数传递给函数(或 lambda)我没有问题,这是我可以以一般方式存储任何类型的函数(任何类型的参数列表和任何类型的返回值)的方式,并且以后仍然可以使用它们。现在,据我所知,我可以创建任何类型的函数,并且可以使用 void 指针存储它们,但我没有办法稍后从该指针以可调用状态重新创建函数。
将它存储在简单的void(void)
lambda 中,正如我之前所说。然后你可以将它转换为 std::function关键是您可以将 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()> valstd::bind(func, parameters...);
如果您在第一次接收函数时这样做,您就不必再考虑参数类型,而只需考虑返回类型。如何处理返回类型将取决于存储函数的用例。一种简单的方法是要求 Function
是一个 void 函数,如果无法将值传递回 API 的使用者,这可能是有意义的。
【讨论】:
这听起来像是一个不错的解决方案,我希望能够有返回值,但我可能会使用你的方式,只是有不同的方式来存储标准类型(如 int、float 和 char)并且不要让用户发送具有自定义类型返回值的函数。我猜那没有办法存储一个完全通用的函数呢? @Gamewolf3000 您打算如何将返回值传递给 TestFunction 的使用者?如果您打算直接从 testfunction 返回类似未来的值,则可以将该函数转换为 void 可调用对象。或者,如果您想在存储该函数的类上使用另一个函数,您可能必须在返回类型上对其进行参数化。 我原本打算从 api 的函数中返回一种智能指针,从中可以检索到有关任务状态(等待、完成等)的信息,以及 void指向返回数据的指针。但是我越想它就越崩溃,因为即使我可以概括它,还有一个问题是如何处理非动态分配的回报(谁负责)。因此,如果您无法获得返回值并且用户可以解决它,那么它可能会更好,但是有一种方法来获取任何类型的函数仍然会很好以上是关于c++存储函数和参数列表供以后使用的主要内容,如果未能解决你的问题,请参考以下文章