我正在尝试传递参数和函数指针。
目前我有这段代码可以工作,但我想重构它以避免为 doUserAnimation 调用创建足迹(?)。
#include <string>
#include <iostream>
typedef void (*AnimationFunction) ();
int gDefaultAnimationCount = 0;
struct LedAnimationArray
{
std::string name;
AnimationFunction function;
};
void A_AllDark()
{
std::cout << "BuiltInAllDark";
std::cout << '\n';
}
void A_AllLight()
{
std::cout << "BuiltInAllLight";
std::cout << '\n';
}
void doUserAnimation(int animationNumber)
{
std::cout << "UserAnimation_";
std::cout << animationNumber;
std::cout << '\n';
}
LedAnimationArray _builtInAnimations[]
{
{"Off", A_AllDark},
{"On", A_AllLight}
};
// [Start want to remove this code]
void UserAni1()
{
doUserAnimation(0);
}
void UserAni2()
{
doUserAnimation(1);
}
LedAnimationArray _userAnimations[]
{
{"UserAni1",UserAni1},
{"UserAni2",UserAni2}
};
// [End want to remove this code]
LedAnimationArray getAnimation(int animationNumber)
{
if (animationNumber > gDefaultAnimationCount - 1)
{
LedAnimationArray b = {"usertest",_userAnimations[animationNumber-gDefaultAnimationCount].function};
// I want to try and do something like this, but that works :)
//LedAnimationArray b = {"usertest", doUserAnimation(animationNumber-gDefaultAnimationCount)};
return b;
}
else
{
return _builtInAnimations[animationNumber];
}
}
int main()
{
gDefaultAnimationCount = sizeof(_builtInAnimations) / sizeof(_builtInAnimations[0]) ;
getAnimation(0).function();
getAnimation(1).function();
getAnimation(2).function();
getAnimation(3).function();
return 0;
}
所以我目前将指针传递给数组中的函数,如下所示:
LedAnimationArray b = {"usertest",_userAnimations[animationNumber-gDefaultAnimationCount].function};
但这意味着我必须预先定义一个包含所有可能性的数组。
我想尝试删除
_userAnimation
数组,并传递一个带有参数的函数。
类似这样的:
LedAnimationArray b = {"usertest",doUserAnimation(animationNumber-gDefaultAnimationCount)};
基本上是这样的?
添加
#include <functional>
并将现有行替换为
typedef std::function<void()> AnimationFunction;
LedAnimationArray b = {"usertest", [animationNumber]() { doUserAnimation(animationNumber-gDefaultAnimationCount); }};