带参数的非Void函数的Void包装
Void Wrappers for Nonvoid Functions With An Argument
因此,我有以下情况:
-
我正在一个低内存微控制器上为mbed在线编译器编码。
-
实时性能非常重要,我希望这需要不到一微秒的时间。10微秒是可以容忍的。
-
我使用他们的超时库,它提供了一个API,用于在指定时间后调用ISR,但要求ISR是一个void/void函数。(包括会员功能。
void TimeoutCallback(void) { do stuff that I want to do on timeout.} // ISR Timeout to; to.attach_us(&TimeoutCallback, 750) // Call TimeoutCallback in 750 us.
-
我创建了一个Timeout对象的向量,这些对象一次设置为相同的函数,时间不同。我想以某种方式传递到TimeoutCallback,Timeout对象调用了它。
我最初的想法是重载Timeout类,使其能够接受int函数(int)函数指针,并接受重载的attach函数中传递给所述函数指针的数字。然而,考虑到Timeout类的混乱(和特定于设备的)继承,我不确定这是否真的可行。
现在,我想知道是否有一种方法可以用程序创建一个void/void函数,该函数封装了一个void/int函数,并包含一个可更改的引用int,该引用int传递给被封装的函数。
虽然Tony D的解决方案在使用mbed Ticker
类时是合适的,但也有一种使用mbed RtosTimer
的替代方法。
RtosTimer
构造函数接受一个void*
参数,该参数在超时时传递给处理程序。处理程序具有签名:
void handler(void const* n)
其中n
是传递给构造函数的指针参数,可用于标识特定超时。
与超时函数在中断上下文中运行的Ticker
不同,对于RtosTimer
,处理程序作为线程运行,因此提供了更大的灵活性,但可能会有更大的延迟。
由于您的库可以调用成员函数,因此您可以创建一个适配器ala.…
template <typename Func, Func func>
struct Adapter
{
Adapter(int n) : n_(n) { }
void f() { func(n_); }
int n_;
};
使用它:
Adapter<void(*)(int), My_Function_Expecting_An_Int> adapter(the_int);
to.attach_us(&adapter, &decltype(adapter)::f, timeout_us);
确保adapter
的生存期持续到回调。。。。
调用成员函数:
#include <iostream>
#include <string>
#include <vector>
struct MyObj
{
void f(int n) { std::cout <<"hi " << n << "n"; }
};
template <typename Class, typename PFunc>
struct Adapter
{
Adapter(Class& object, PFunc pFunc, int n) : object_(object), pFunc_(pFunc), n_(n) { }
void f() { (object_.*pFunc_)(n_); }
Class& object_;
PFunc pFunc_;
int n_;
};
int main()
{
MyObj myObj;
Adapter<MyObj, void(MyObj::*)(int)> adapter(myObj, &MyObj::f, 43);
adapter.f();
}
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 如何将指针从一个void函数传递到另一个C++
- 为什么我在使用void函数时得到错误代码C2276
- 指针没有更新它在void函数内部指向的值
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- void 函数可以传递值参数吗?
- 在 void 函数中使用 #include 变量C++
- 如何在 C++ 中将 void 函数传递给 void 指针
- 使用运算符调用 void 函数时出错<set>
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- C++ :: 如何捕获由 void 函数创建的矩阵
- 如何将一个 void 函数传递给另一个 void 函数?
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- C++命名空间中调用 void 函数的错误
- 当数组位于两个循环之间时,您可以调用数组的 void 函数吗?
- 结构新手,我对如何从 void 函数中返回值并将其放入另一个函数感到困惑
- 查找素数:错误:控件到达非void函数的末尾