使用函数指针传递变量 C++

问题描述 投票:0回答:1

我正在尝试传递参数和函数指针。

目前我有这段代码可以工作,但我想重构它以避免为 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)};
c++ esp32
1个回答
0
投票

基本上是这样的?

添加

#include <functional>

并将现有行替换为

typedef std::function<void()> AnimationFunction;
LedAnimationArray b = {"usertest", [animationNumber]() { doUserAnimation(animationNumber-gDefaultAnimationCount); }};
© www.soinside.com 2019 - 2024. All rights reserved.