将多个功能存储到阵列C 以进行循环
Store multiple functions into array C++ for looping
我有两个称为
的函数-
void funcBlock(A a, B b, int C, long& R, long& M, double& D)
-
void funcNormal(A a, B b, long& R, long& M, double& D)
在主要方法中,我想通过循环使用这两个函数的值,例如
主要方法:
combineFunc cfs[] = { funcBlock, funcNormal }
for (int idx = 0; idx < 2; idx++) //Cause it has two functions to loop over
{
combineFunc cf = cfs[idx];
//Do the rest of the stuffs
}
我遇到错误:
错误:无法将'void(*)(a,b,int,long int&amp;,long int&amp;,double&amp;)'转换为初始化中的" combineFunc"
我该如何修复?
这是不可能的,因为您的功能具有不同的签名(这些类型不同)。C 不支持不同类型的元素的数组。但是您可以通过添加未使用的参数来匹配签名,它根本不会更改任何内容,但允许您将它们放在一个容器中:
typedef void(*combineFunc)(A, B, int, long int&, long int&, double&);
void funcBlock(A a, B b, int C, long& R, long& M, double& D);
void funcNormal(A a, B b, int unused, long& R, long& M, double& D);
combineFunc cfs[] = { funcBlock, funcNormal };
另一种方法是使用可以存储所有功能的结构数组,例如So
struct combineFunc
{
enum TYPE
{
NORMAL,
BLOCK
} type;
combineFunc(void(*nf)(A, B, int, long int&, long int&, double&)) :
type(NORMAL), nf_(nf)
{
}
combineFunc(void(*fb)(A, B, long int&, long int&, double&)) :
type(BLOCK), fb_(fb)
{
}
union
{
void(*nf_)(A, B, int, long int&, long int&, double&);
void(*fb_)(A, B, long int&, long int&, double&);
};
};
CombineFunc cfs[] = { funcBlock, funcNormal };
您的问题最好通过问题回答。
在循环中,当您调用cf(arguments)
时,您会在括号之间写下什么参数?参数是否包括C
?
我认为,如果您回答这个问题,您会明白为什么要在您的程序进行重新设计之前可能无法做的事情。但是,重新设计可能很简单,就像让funcNormal()
接受(忽略)一个虚拟参数代替C
。
如果最后一个建议是您想要的,则
void funcNormal(A a, B b, int, long& R, long& M, double& D)
请注意,由于忽略了int
。
c 是一种静态打字的语言。阵列是同质的:数组的所有元素都具有完全相同的类型。
指向一种类型函数的指针是与指针到另一种函数类型的不同类型。函数的类型取决于其参数和返回类型。因此,不可能将指针存储到同一数组中的不同参数列表的函数。
然而,"类型擦除"的技术允许模拟动态键入。C 标准库带有两个异质包装器:std::variant
和std::any
。变体是标记联盟的实现。它可用于从预定义的类型列表中存储对象。any
是void*
的类型安全包装器。它可以存储任何类型的对象。因此,可能是您要寻找的一系列变体或any
。
它们只是低级工具,对于更精美的异质处理,有现有库,例如boost.hana。
假设您有一组可以使用它们的变量,并且所有这些变量都有固定的类型,则可以将功能包装在Lambdas中以正常化其类型:
using combineFunc = void(*)(A, B, int, long int&, long int&, double&);
combineFunc cfs[] = {
[](A a, B b, int C, long& R, long& M, double& D){ funcBlock(a, b, C, R, M, D); },
[](A a, B b, int, long& R, long& M, double& D){ funcNormal(a, b, R, M, D); }
};
// do whatever
- 实现循环阵列队列
- 为什么基于循环范围不直接在C 中使用参数阵列
- 数组 - 循环遍历辅助阵列
- 如果在C 中已经回荡了另一个相同值的阵列元素,请防止循环回荡
- 为了通过阵列C 的表递增循环
- 我如何使我的循环转到char*阵列的尽头,并将每个城市都放在链接的列表中(城市被划分为白色的空间)
- 将多个功能存储到阵列C 以进行循环
- 存储文件中的字符串,但是数组仍然为空?阵列大小的循环
- 我该如何仅使用循环而无需阵列或向量
- 将整数从for循环存储在全球阵列中
- 每次循环时,输出一个具有较小字符的字符阵列
- C :自动变量扣除额的范围与循环的范围与多维阵列的循环的正常范围
- 标记元素C 阵列带嵌套循环
- 循环时,如何在C 中创建一个自动插入阵列
- 在循环的停止条件下访问阵列值是安全的吗?
- 将指针设置为双阵列以进行循环
- 我是否必须求助于循环,以比较C 中的两个2D阵列
- 将一个阵列设置为一个不循环的阵列
- 循环穿过阵列
- 将C++阵列存储在循环之外