如何将sdt :: function类型分配给sigevent.sigev_notify_function(POSIX计时器)

时间:2019-01-16 09:54:52

标签: c++11 posix

我正在使用POSIX计时器来调用使用std :: function模板定义的函数:

typedef std::function<void (union sigval)> functionCbType;

分配结构sigevent的字段sigev_notify_function时出现以下错误:

错误:分配中无法将“ functionCbType {aka std :: function}”转换为“ void()(sigval_t){aka void()(sigval)}”      se.sigev_notify_function = callcbk;

functionCbType callcbk;
...
struct sigevent se;
se.sigev_notify = SIGEV_THREAD;
se.sigev_notify_function = callcbk;
se.sigev_notify_attributes = NULL;

int status = timer_create(CLOCK_MONOTONIC, &se, &timer_id);

se.sigev_notify_function期望

void       (*sigev_notify_function) (union sigval);

正确的方法是什么?

2 个答案:

答案 0 :(得分:0)

sigevent结构sigev_notify_function不需要一个std::function对象,它需要一个函数指针:

void       (*sigev_notify_function) (union sigval);

可以从函数指针隐式创建一个std::function对象,但是不可能相反。您必须使用指向实际函数的指针。

您可以使用callcbk.target<void(*)(union sigval)>()来获取指向原始函数指针的指针,但是callcbk却毫无意义。

答案 1 :(得分:0)

设计良好的C回调API可让您将值传递给回调函数。这使您可以进行状态回调。

在这种情况下,intvoid*std::function<Sig>的并集。您应该将自己的状态停留在这两个状态中。

std::function可以存储状态,因此您需要通过该状态。

void*不是函数指针。为了将其传递给C函数回调API,您需要对其进行包装并将其作为struct sig_cb { void(* function)(sigval_t); void* pvoid; }; sig_cb make_signal_callback( std::function<void()>* pf ) { return { [](sigval_t v) { (*static_cast<std::function<void()>*>(v.sival_ptr))(); }, pf }; } 部分传递。

functionCbType callcbk;
...
struct sigevent se;
auto cb = make_signal_callback(&callcbk);
se.sigev_notify = SIGEV_THREAD;
se.sigev_notify_function = cb.function;
se.sigev_value.sival_ptr = cb.pvoid;
se.sigev_notify_attributes = NULL;

int status = timer_create(CLOCK_MONOTONIC, &se, &timer_id);

然后修改您的代码:

std::function

,它应该可以工作。自然,const wrapper = mount(<ModalComponent />); const input = wrapper.find('input'); const event = {target: {value: 'testValue'}}; input.simulate('change', event); 的生存期必须单独管理。