[英]Passing function parameters into class function pointer parameters
试图在Arduino中创建一个可以轻松处理毫秒延迟的类。 我的想法是创建一个类,您可以在其中传递要运行的函数以及延迟时间。 调用run
方法会检查延迟时间是否已过去,并且可以运行该函数。
MillisTimer MT_measureAndWrite(measureAndWrite, 1000);
measureAndWrite
函数具有void
返回类型和零参数。 我能够做到这一点。 运行良好。
但是我遇到了一个我想使用带有参数的函数的问题。 我尝试使用模板类,但没有运气
MillisTimer<float, float, float, float> MT_LCDrefresh(LCDrefresh(1.5,2.5,3.5,4,5), 500);
template <class A = void, class B = void, class C = void, class D = void>
class MillisTimer
{
private:
void(*mFunc0)(A,B,C,D);
const uint16_t mDelayTime;
unsigned long mPreviousTime;
const bool mDebugMode;
public:
MillisTimer(void(*func)(), uint16_t delayTime, bool debugMode = false) : mDelayTime(delayTime), mDebugMode(debugMode)
{
mFunc0 = func;
mPreviousTime = millis();
}
MillisTimer(void(*func)(A), uint16_t delayTime, bool debugMode = false) : mDelayTime(delayTime), mDebugMode(debugMode)
{
mFunc0 = func;
mPreviousTime = millis();
}
MillisTimer(void(*func)(A, B), uint16_t delayTime, bool debugMode = false) : mDelayTime(delayTime), mDebugMode(debugMode)
{
mFunc0 = func;
mPreviousTime = millis();
}
MillisTimer(void(*func)(A, B, C), uint16_t delayTime, bool debugMode = false) : mDelayTime(delayTime), mDebugMode(debugMode)
{
mFunc0 = func;
mPreviousTime = millis();
}
MillisTimer(void(*func)(A, B, C, D), uint16_t delayTime, bool debugMode = false) : mDelayTime(delayTime), mDebugMode(debugMode)
{
mFunc0 = func;
mPreviousTime = millis();
}
void run() {
if (millis() - mPreviousTime >= mDelayTime)
{
if (mDebugMode) Serial.println("uId: " + String((unsigned long)this) + " millis: " + String(millis() + "ms"));
mPreviousTime = millis();
mFunc0();
}
}
};
解:
class MillisTimer
{
private:
void (*mFunc)();
const uint16_t mDelayTime;
unsigned long mPreviousTime;
const bool mDebugMode;
public:
MillisTimer(void(*func)(), uint16_t delayTime, bool debugMode = false) : mDelayTime(delayTime), mDebugMode(debugMode), mPreviousTime(millis())
{
mFunc = func;
}
void run() {
if (millis() - mPreviousTime >= mDelayTime)
{
if (mDebugMode) Serial.println("uId: " + String((unsigned long)this) + " millis: " + String(millis() + "ms"));
mPreviousTime = millis();
mFunc();
}
}
};
MillisTimer MT_measureAndWrite(measureAndWrite, 1000);
MillisTimer MT_LCDfrissit([](){LCDfrissit_(U_Akku, Teljesitmeny, U_Atlag, U_Korrekt);},500);
将函子直接传递给您的班级:
template <class F>
class MillisTimer
{
private:
F mF;
const uint16_t mDelayTime;
unsigned long mPreviousTime = 0;
const bool mDebugMode;
public:
MillisTimer(F f, uint16_t delayTime, bool debugMode = false) :
f(f), mDelayTime(delayTime), mPreviousTime(millis()), mDebugMode(debugMode)
{
}
void run() {
if (millis() - mPreviousTime >= mDelayTime)
{
if (mDebugMode) {
Serial.println("uId: " + String((unsigned long)this)
+ " millis: " + String(millis() + "ms"));
}
mPreviousTime = millis();
mF();
}
}
};
template <typename F>
MillisTimer<F> MakeMillisTimer(F f, uint16_t delayTime, bool debugMode = false)
{
return {f, delayTime, debugMode};
}
用法:
auto MT_measureAndWrite = MakeMillisTimer(&measureAndWrite, 1000);
auto MT_LCDrefresh = = MakeMillisTimer([](){ LCDrefresh(1.5, 2.5, 3.5, 4, 5); }, 500);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.