将多个功能存储到阵列C 以进行循环

Store multiple functions into array C++ for looping

本文关键字:循环 阵列 功能 存储      更新时间:2023-10-16

我有两个称为

的函数
  1. void funcBlock(A a, B b, int C, long& R, long& M, double& D)
  2. 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::variantstd::any。变体是标记联盟的实现。它可用于从预定义的类型列表中存储对象。anyvoid*的类型安全包装器。它可以存储任何类型的对象。因此,可能是您要寻找的一系列变体或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