在Bjarne Stroustrup的主页( C ++ 11 FAQ )中: struct X { int foo(int); }; std::function<int(X*, int)> f; f = &X::foo; //pointer to member X x; int v = f(&x, 5); //call X::foo() for x with 5 它是如何工作的? std :: function如何调用foo成员函数 ? 模板参数是int(X*, int) ,是从成员函数指针转换成非成员函数指针的 &X::foo ? (int(*)(X*, int))&X::foo //casting (int(X::*)(int) to (int(*)(X*, int)) 澄清:我知道我们不需要使用任何指针来使用std :: function […]
我有一个指针function,假设任何签名。 我有5个不同的function相同的签名。 在运行时,其中的一个被分配到指针,并调用该函数。 如果不在这些函数中插入任何print语句,我怎么才能知道指针当前指向的函数的名字?
根据Scott Meyers的说法,C ++在C上的一个领域是函数对象比函数指针快。 他说这是因为函数对象是内联的,这会提高速度。 我有两个问题: 我们如何validation函数对象实际上是内联的呢? 我们可以在实践中validation这个吗? 函数对象的内联取决于我们使用的编译器,还是所有的编译器都像这样?
我只是通过互联网上的一些代码,发现这一点: float * (*(*foo())[SIZE][SIZE])() 我如何阅读这份声明? 阅读这种复杂的声明是否有一套特定的规则?
我无法弄清楚这一点: int main() { int (*) (int *) = 5; return 0; } 上面的任务用g ++ c ++ 11编译。 我知道int (*) (int *)是一个函数的指针,它接受一个(int *)作为参数,并返回一个int,但我不明白你怎么可以将它等于5.起初我以为它是一个不断返回5的函数(从我最近学习的F#中,可能是哈哈),然后我简单地想,函数指针指向内存位置5,但是这不起作用,很明显,也不是hex值。 认为这可能是因为该函数返回一个int,并分配一个int是好的(不知何故),我也试过这个: int * (*) (int *) = my_ptr 其中my_ptr的types为int * ,与第二个函数指针的types相同,如第一种情况下的types为int。 这不会编译。 赋值5或者任何int值,而不是my_ptr ,也不会为这个函数指针编译。 那么这个任务是什么意思? 更新1 我们已经确认这是一个错误,如最佳答案所示。 但是,我们仍然不知道实际发生的情况是您分配给函数指针的值是什么,或者赋值时发生了什么。 任何(好)的解释,将非常感激! 请参阅下面的编辑,以更清楚地了解这个问题。 编辑1 我使用的是gcc版本4.8.2(在Ubuntu 4.8.2中) 编辑2 其实,把它等同于我的编译器。 即使将它等同于一个std :: stringvariables,或者返回一个double的函数名也是可行的。 编辑2.1 有趣的是,把它作为函数指针指向任何返回不是指针的数据types的函数,都会让它编译,比如 std::string (*) […]
我发现C代码打印从1到1000没有循环或条件 :但我不明白它是如何工作的。 任何人都可以通过代码并解释每一行? #include <stdio.h> #include <stdlib.h> void main(int j) { printf("%d\n", j); (&main + (&exit – &main)*(j/1000))(j+1); }
我今天刚看了一张照片,觉得我会很感激的解释。 所以这里是图片: 我发现这是令人困惑的,并想知道这样的代码是否可行。 我GOOGLE了图片,发现在这个 reddit条目中的另一张图片,这里是图片: 那么这个“螺旋式阅读”是有效的? 这是如何C编译器parsing? 如果对这个奇怪的代码有更简单的解释,那将会很棒。 除此之外,这些代码可以用吗? 如果是的话,何时何地? 有一个关于“螺旋规则”的问题,但我不只是问如何应用它,或者如何用这个规则来读取expression式。 我质疑这样的expression式和螺旋规则的有效性的使用。 关于这些,一些很好的答案已经发布。
为什么下面的工作? void foo() { cout << "Foo to you too!\n"; }; int main() { void (*p1_foo)() = foo; void (*p2_foo)() = *foo; void (*p3_foo)() = &foo; void (*p4_foo)() = *&foo; void (*p5_foo)() = &*foo; void (*p6_foo)() = **foo; void (*p7_foo)() = **********************foo; (*p1_foo)(); (*p2_foo)(); (*p3_foo)(); (*p4_foo)(); (*p5_foo)(); (*p6_foo)(); (*p7_foo)(); }
我有一个函数名称存储在这样的variables: myvar = 'mypackage.mymodule.myfunction' 现在我想要像这样调用我的function myvar(parameter1, parameter2) 什么是最简单的方法来实现呢?
我怎样才能哈希(std :: tr1 ::哈希或boost ::哈希)一个c + +指针成员函数? 例: 我有几个bool(Class :: * functionPointer)()(非静态)指向类的几个不同的方法,我需要哈希那些指向成员函数。 我怎样才能做到这一点? 也如何比较(std :: less)这些成员函数指针,所以我可以将它们存储在一个std :: set?