如何在c ++中访问传递为指针函数的参数

时间:2016-10-12 00:54:52

标签: c++ c++11

我有一个母函数,它接受一个函数作为它的指针。传递的函数,接受一个整数值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
    }
}

2 个答案:

答案 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) { /* ... */ }

显而易见的答案是,您必须将值与回调一起传递给您的函数。