我可能是一个完全白痴,但我刚看到这个C ++语法,我不能为我的生活弄清楚它在做什么:
(*x)(&a, b, c);
非常感谢快速回答。
答案 0 :(得分:20)
那么可能会有更多的可能性:它取决于所有实体的类型:x
,a
,b
,c
。在C ++中,您甚至可以重载逗号运算符。
但我只关注x
,看看情况如何。但是,如果考虑所有组合,实际答案将会太长。
(*x)(&a, b, c);
此处x
可以是其中之一:
然后你调用它传递三个参数。
以下是一些示例,假设所有其他实体(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在评论中所说:
然而,还有第四种可能性:x可能是某个类的实例,它重载operator *以返回函数指针或函数对象。
这是真的,但我相信这种可能性是由迭代器覆盖部分,或者至少迭代器示例给了你足够的提示来自己解决它。 :-)
希望有所帮助。
答案 1 :(得分:7)
x
似乎是一个函数指针。如果确实如此,则意味着:
取消引用x
以获取函数类型的表达式;
使用参数addressof a
,b
和c
调用该函数。
另请注意,*
周围的()
(取消引用)和x
运算符是多余的;你可以写
x(&a, b, c);
如果x
是函数指针。
答案 2 :(得分:3)
在不知道符号的定义的情况下,不可能100%确定,但我怀疑它是一个函数调用。 (假设x
是指向函数的指针;如果x
具有类类型,则它将取决于类中一元*
的重载。)因此(*x)
是解除引用指针,逻辑上是一个函数;鉴于此,其余的应该是显而易见的。 (注意,正式地,函数在大多数上下文中衰减为指向函数的指针,并且通过指向函数的指针调用。因此,如果x
是指向函数(*x)
和{{1的指针就编译器而言,它们是完全相同的。然而,不是那么人类的读者,并且大多数人会欣赏被称为间接的呼叫。)
答案 3 :(得分:2)
以下是使用可生成相同签名的operator()
的示例。
#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;
}
答案 4 :(得分:1)
x可能是指向函数的指针,或指向函数指针的指针。
答案 5 :(得分:1)
答案 6 :(得分:1)
这很可能是对函数指针指向的函数的调用。更常规的语法如下:
x(&a, b, c);
x
指向一个带三个参数的函数。调用表达式取消引用指针,并将三个参数传递给指针指向的函数。
另一种选择可能是x
是指向对象的指针,该对象定义了三参数运算符()
的覆盖。要知道你需要哪一个提供更多的背景。
答案 7 :(得分:0)
看起来x
是一个指向函数的指针,或一个指向仿函数的指针。 &a, b, c
是呼叫的参数列表。
答案 8 :(得分:0)
它将参数&a, b, c
传递给*x