我有一个母函数,它接受一个函数作为它的指针。传递的函数,接受一个整数值X.在母函数内部,我喜欢访问整数X.我应该怎么做?以下引发了未定义的错误:
bool assign_threads_instructions(void* (* _instr)(int socket_fd) )
{
int pool_size = get_threads_pool_size();
for(int i = 0; i < pool_size; i++)
{
threads_pool[i] = std::thread(_instr, socket_fd); // here I access the socket_fd parameter throws undefined error
}
}
答案 0 :(得分:4)
int
是具有void* (* _instr)(int socket_fd)
参数的函数的(可能)地址,因为_instr
声明了一个名为void*
的指针,它可以指向返回{{{1}的函数。 1}}并取一个名为int
的{{1}}个参数。因此,没有socket_fd
变量,因为你不能(至少不像通过函数指针那样简单)传递一个带参数的可调用包。
您可以单独传递该值:
socket_fd
或者具有模板bool assign_threads_instructions(void* (* _instr)(int), int _fd)
{
std::size_t pool_size = get_threads_pool_size();
for(std::size_t i = 0; i < pool_size; ++i)
{
threads_pool[i] = std::thread(_instr, _fd);
}
}
函数,该函数具有待推导的参数,并使用assign_threads_instructions
生成一个具有所需值的可调用函数。
std::bind
示例:
如果你有一个分配功能模板,如:
std::bind
您可以使用它通过std :: bind:
将回调和值一起打包到一个参数中template<class F>
void assign_stuff(F&& _f)
{
std::thread work(_f);
work.join();
}
打印
57
答案 1 :(得分:1)
您的函数声明assign_threads_instructions
只需一个参数:_instr
类型为void* (*_instr) (int)
,即:
指向函数的指针,指向
int
并返回指向void
的指针。
除了可读性之外,类型中int
的不必要命名无效。
使用现代C ++语法可以更清晰。
using callback_t = std::add_pointer_t<void*(int)>;
bool assign_threads_instructions(callback_t instr) { /* ... */ }
显而易见的答案是,您必须将值与回调一起传递给您的函数。