-1

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

typedef double* (*func)(double*, double);

...

func* functions = new func[5];

我知道这typedef是执行此操作的“正确”方法,但我想知道是否有办法在不使用typedef. 我能找到的关于这种类型的所有信息只使用函数指针数组,而不是指向函数指针的指针。我认为减税

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

会是正确的,但我似乎无法弄清楚如何使用new.

4

4 回答 4

3
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。

于 2013-08-31T19:33:06.397 回答
1
std::vector<double*(*)(double*, double)> function_table;

但抛开人为限制:

typedef double *(*f_ptr)(double*, double);
std::vector<f_ptr> function_table;
于 2013-08-31T19:31:56.287 回答
0

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

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

将声明一个指向返回 a 的函数的指针double *,带有参数 adouble *和 a double

但是,即使在它成为指向指针的指针之前,它也很难阅读,所以我不相信你会想要这样做只是为了节省一点打字......(typedef和一个名字)。

当然,由于这是 C++,使用

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

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

std::vector<std::function<std::vector<double>(std::vector<double>, double)>> fns;`
于 2013-08-31T19:28:56.363 回答
-1
  • Are you getting an error message if you try to initialize the variable functions? If so then you need to cast the initialization to.
  • func* functions = (func *) new func[5];
于 2013-08-31T19:40:40.413 回答