私はおそらく完全なばかですが、このC ++構文を見たばかりで、それが何をしているのかを一生理解することはできません。
(*x)(&a, b, c);
迅速な回答をいただければ幸いです。
さらに多くの可能性があります。それはすべて、すべてのエンティティのタイプに依存します: x
、a
、。C++ では、カンマ演算子でもオーバーロードできます。b
c
しかし、私は だけに焦点を当てx
、物事がどうなるか見ていきます。ただし、すべての組み合わせを考慮すると、実際の答えは長くなりすぎます。
(*x)(&a, b, c);
次x
のいずれかになります。
そして、3 つの引数を渡して呼び出しています。
a
他のすべてのエンティティ ( 、b
c
) をと仮定して、いくつかの例を次に示しますint
。
仮定
int a,b,c; //FIXED as per the assumption
関数ポインタ
void f(int *,int, int);
auto *x = f;
(*x)(&a,b,c); //x is function pointer
x(&a,b,c); //works fine, even without (*x)
関数オブジェクト
struct X { void operator()(int*,int,int); };
X y, *x = &y;
(*x)(&a,b,c); //x is pointer to function object
イテレーター
std::list<std::function<void(int*,int,int)> l {X(), f};
auto x = l.begin(); //x is an iterator
(*x)(&a,b,c); //(*x) is function object
++x;
(*x)(&a,b,c); //(*x) is function object (still!)
//OR
std::list<void(int*,int,int)> l {f};
auto x = l.begin(); //x is an iterator
(*x)(&a,b,c); //(*x) is function pointer!
@Davidがコメントで言ったように:
ただし、4 つ目の可能性があります。x は、関数ポインターまたは関数オブジェクトを返すために operator* をオーバーロードするクラスのインスタンスである可能性があります。
これは本当ですが、この可能性はイテレータによって部分的にカバーされていると思います。または、少なくともイテレータの例は、自分でそれを理解するのに十分なヒントを与えてくれました。:-)
それが役立つことを願っています。
x
関数ポインタのようです。これが事実である場合、実際、それは次のことを意味します。
x
関数型の式を取得するための間接参照。
addressof a
引数、、b
およびを使用してその関数を呼び出しますc
。
*
また、 (逆参照)と()
その周りの演算子は不要であることに注意してくださいx
。あなたは書ける
x(&a, b, c);
x
関数ポインタの場合も同様です。
シンボルの定義を知らずに 100% 確信することは不可能ですが、関数呼び出しではないかと思います。x
(が関数へのポインターであると仮定します。x
クラス型を持っている場合は、クラス内の単項のオーバーロードに依存し*
ます。)(*x)
はポインターを逆参照し、論理的には関数です。これを考えると、残りは明らかなはずです。(正式には、関数はほとんどのコンテキストで関数へのポインターに崩壊し、関数へのポインターを介して呼び出すことに注意してください。したがって、ifx
は関数へのポインターであり(*x)
、x
コンパイラーに関する限り同一です。そうではありません。ただし、人間の読者は、呼び出しが間接的であると言われることを歓迎します.)
operator()
以下は、同一の署名を作成できる whichの使用例です。
#include <iostream>
using namespace std;
struct sample {
void operator()(int* a, int b, int c) {
*a = b = c;
return;
}
};
int main() {
sample* x;
int a = 1, b = 1, c = 1;
(*x)(&a, b, c);
return 0;
}
xは、おそらく関数へのポインター、または関数へのポインターへのポインターです。
これは、関数ポインタが指す関数の呼び出しである可能性が最も高いです。より一般的な構文は次のとおりです。
x(&a, b, c);
x
3 つの引数を取る関数を指します。呼び出し式はポインターを逆参照し、ポインターが指す関数に 3 つの引数を渡します。
x
別の方法として、3 引数 operator のオーバーライドを定義するオブジェクトへのポインターを指定することもできます()
。それがどれであるかを知るには、より多くのコンテキストを提供する必要があります。
x
関数へのポインタから関数へのポインタ、またはファンクタへのポインタのいずれかである ように見えます。&a, b, c
呼び出しの引数リストです。
&a, b, c
が指す関数に引数を渡しています*x