繁体   English   中英

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

[英]How to access a parameter of a passed-as-pointer function in c++

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

_instr是具有int参数的函数的(可能)地址,因为void* (* _instr)(int socket_fd)声明了一个名为_instr的指针,该指针可以指向返回void*的函数,并接受一个名为socket_fd int参数。 因此,没有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待推论参数的模板assign_threads_instructions函数,并使用std::bind生成具有所需值的可调用包装。

std::bind示例:

如果您有一个分配功能模板,例如:

template<class F>
void assign_stuff(F&& _f)
{
  std::thread work(_f);
  work.join();
}

您可以使用它通过std :: bind将回调和值打包到一个参数中:

void f(int& x)
{
  x = x + 2;
}
int main() 
{
  int q = 55;
  assign_stuff(std::bind(&f, std::ref(q)));
  std::cout << q << "\n";
  return 0;
}

版画

57

函数指针只是函数指针

函数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) { /* ... */ }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM