-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

本当の答えは、コメントの 1 つに示されています。

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

double *は、引数 adouble *および aを使用して、 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 に答える