37

次のtypedefを検討してください。

typedef int (*f1)(float);
typedef f1 (*f2)(double);
typedef f2 (*f3)(int);

f2関数ポインタを返す関数です。と同じですが、関数の型、つまり戻るf3ポインタはです。typedefなしで定義するにはどうすればよいですか?typedefは、を定義するためのよりクリーンで理解しやすい方法であることを私は知っています。ただし、ここでの私の意図は、C構文をよりよく理解することです。f3f2f3f3

4

7 に答える 7

137

の宣言から始めますf1

int (*f1)(float);

f2を返す関数へのポインターになりたいので、上記の宣言を の宣言にf1置き換えます。f1f2

int (*      f1     )(float);
            |
      +-----+-----+
      |           |
      v           v
int (*(*f2)(double))(float);

宣言は次のように読みます

        f2                   -- f2
       *f2                   -- is a pointer
      (*f2)(      )          -- to a function
      (*f2)(double)          --   taking a double parameter
     *(*f2)(double)          --   returning a pointer
    (*(*f2)(double))(     )  --   to a function
    (*(*f2)(double))(float)  --     taking a float parameter
int (*(*f2)(double))(float)  --     returning int

次のプロセスを繰り返しますf3

int (*(*    f2    )(double))(float);
            |
        +---+----+
        |        |
        v        v
int (*(*(*f3)(int))(double))(float);

次のように読み取ります

          f3                           -- f3
         *f3                           -- is a pointer
        (*f3)(   )                     -- to a function
        (*f3)(int)                     --   taking an int parameter
       *(*f3)(int)                     --   returning a pointer
      (*(*f3)(int))(      )            --   to a function
      (*(*f3)(int))(double)            --     taking a double parameter
     *(*(*f3)(int))(double)            --     returning a pointer
    (*(*(*f3)(int))(double))(     )    --     to a function
    (*(*(*f3)(int))(double))(float)    --       taking a float parameter
int (*(*(*f3)(int))(double))(float);   --       returning int
于 2012-05-25T18:07:35.793 に答える
14

C++ では、テンプレートの奇跡により、これが少し簡単になります。

#include <type_traits>

std::add_pointer<
    std::add_pointer<
        std::add_pointer<
            int(float)
        >::type(double)
    >::type(int)
>::type wow;
于 2012-05-25T17:30:56.977 に答える
7

typedef と同じように、名前の代わりに関数定義を配置するだけです。

次のようf2になります。

typedef int (*(*f2)(double))(float);

f3私はこれが宿題だと仮定しているので、あなたは練習として行うことができます;)

于 2012-05-25T17:26:19.110 に答える
6

ただしないでください。それはできますが、非常に混乱します。Typedef は、この短いコードの記述と読み取りを容易にするために存在します。

f引数を取らず、関数ポインターを返す関数は、int (*)(float)おそらく (未テスト) のようになります。

int (*f())(float);

あとは、lisp のように見えるまで括弧を追加し続ける必要があります。

于 2012-05-25T17:32:50.463 に答える
0

使用std::function:

typedef std::function<int(float)> f1;
typedef std::function<f1(double)> f2;
typedef std::function<f2(int)>    f3;

また

typedef std::function<std::function<std::function<int(float)>(double)>(int)> f3;
于 2012-06-01T17:38:46.057 に答える