我正在尝试使用在运行时确定的长度为double* (*func)(double*, double)
的函数指针集合。我可以使用typedef
typedef double* (*func)(double*, double);
...
func* functions = new func[5];
我理解typedef
是'正确'的方法,但我想知道是否有办法在不使用typedef
的情况下执行此操作。我在这类事物上找到的所有信息只使用函数指针的arryays而不是指向函数指针的指针。我认为是decalration
double* (**functions)(double*, double);
是正确的,但我似乎无法弄清楚如何使用new
初始化这样的事情。
答案 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)