使用指向没有typedef的函数指针的指针?

时间:2013-08-31 19:17:24

标签: c++ c function-pointers

我正在尝试使用在运行时确定的长度为double* (*func)(double*, double)的函数指针集合。我可以使用typedef

来执行此操作
typedef double* (*func)(double*, double);

...

func* functions = new func[5];

我理解typedef是'正确'的方法,但我想知道是否有办法在不使用typedef的情况下执行此操作。我在这类事物上找到的所有信息只使用函数指针的arryays而不是指向函数指针的指针。我认为是decalration

double* (**functions)(double*, double);

是正确的,但我似乎无法弄清楚如何使用new初始化这样的事情。

4 个答案:

答案 0 :(得分:4)

double *(**functions)(double *, double) = new (double *(*[5])(double *, double));

new表达式中使用抽象函数类型(或指向函数的指针),需要将抽象类型放在括号中 - 来自C ++规范的5.3.4:

  

new-expression:
  
:: opt new new-placement opt new-type-id new-initializer opt
  
:: opt new new-placement opt type-id new-initializer opt

new-type-id 无法表达函数类型。

如果您尝试自动生成(或混淆)代码,了解C ++语法规范的详细信息非常有用,但对于您希望人类阅读的实际代码,您应该只使用typedef。

答案 1 :(得分:1)

std::vector<double*(*)(double*, double)> function_table;

但放下人为约束:

typedef double *(*f_ptr)(double*, double);
std::vector<f_ptr> function_table;

答案 2 :(得分:0)

其中一条评论给出了真正的答案:

double *(**fns)(double *, double)

将声明指向函数的指针,该函数返回double *,参数为double *double

然而,即使在它成为指针的指针之前,它也很难阅读,所以我不相信你只想节省一点点打字......(typedef和一个名字)。

当然,因为这是C ++,使用

std::vector<std::function<double *(double *, double)>> fns;

将是“正确”的事情,甚至可能

std::vector<std::function<std::vector<double>(std::vector<double>, double)>> fns;`

答案 3 :(得分:-1)

  • 如果您尝试初始化变量函数,是否收到错误消息?如果是,那么你需要将初始化转换为。
  • func * functions =(func *)new func [5];
相关问题