我正在使用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);
正确的方法是什么?
答案 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可让您将值传递给回调函数。这使您可以进行状态回调。
在这种情况下,int
是void*
和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);
的生存期必须单独管理。