gpt4 book ai didi

c++ - 在 C++ 的预处理器中创建函数

转载 作者:行者123 更新时间:2023-11-28 02:58:10 25 4
gpt4 key购买 nike

我在 Arduino IDE 中使用一个定时器库,它有一个函数,它将“void(*func)(void)”作为参数并在一定时间后运行它。我需要在我的代码中传递一个函数库,问题是我需要做同样事情的“n”个函数(只是函数内部涉及的变量采用不同的值,我从结构数组中获取),这就是为什么我不能只使用一个函数,我需要能够编译具有相同语法但涉及不同变量的不同函数。

我不知道如何解决这个问题,我想做的是能够像在 for 循环中一样创建函数,

for(int i=0;i<MAX_FUNC;i++)
{
void func[i](){
x= structuredata.x[i];
}
}

我知道这种语法是完全错误的,但我想知道我怎样才能实现这样的目标。我尝试改用类,但库不允许我使用在类中创建的 void 函数作为参数,它指示“未解析的重载函数类型”

最佳答案

如果您热衷于模板覆盖并且可以像这样重构您的函数,那么打包一堆回调以连续触发的解决方案比您想象的更接近。如果函数的一致性完全相同,您可以使其更通用。 IE。你可以这样做:

#include <iostream>

int ar[5] = { 1,2,3,4,5 };

// your function here
template <int i>
void callback()
{
// your code here. i is provided
int x = ar[i];
std::cout << "Got Value: " << x << '\n';
};

////////////////////////////////////////////////////////////

// unraveller
template<int N>
void callback_set()
{
callback_set<N-1>();
callback<N-1>();
}

// base callback set
template<>
void callback_set<0>() {}

////////////////////////////////////////////////////////////

int main()
{
callback_set<3>();
return 0;
}

输出

Got Value: 1
Got Value: 2
Got Value: 3

您“注册”callback_set<N>作为您的回调,它将为您链接对您的函数的调用。如果需要对不同实现进行个性化访问,您仍然可以使用完全特化:

#include <iostream>

// prototypes
template <int i>
void callback() {};

// your functions here
template<>
void callback<0>()
{
std::cout << "Callback #0" << '\n';
}

template<>
void callback<1>()
{
std::cout << "Callback #1" << '\n';
}

template<>
void callback<2>()
{
std::cout << "Callback #2" << '\n';
}
////////////////////////////////////////////////////////////


// unraveller
template<int N>
void callback_set()
{
callback_set<N-1>();
callback<N-1>();
}

// base callback set
template<>
void callback_set<0>() {}
////////////////////////////////////////////////////////////

int main()
{
callback_set<3>();
return 0;
}

输出

Callback #0
Callback #1
Callback #2

本质上,您使用 callback_set<N> 来设计您注册的回调。其中 N是您为其提供覆盖的回调数。只是一个想法,但如果我理解正确的话,这似乎是解决您的问题的一个相当优雅的解决方案。

关于c++ - 在 C++ 的预处理器中创建函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21520260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com