这可能是常见和微不足道的事情,但我似乎无法找到具体的答案.在C#中有一个委托的概念,它与C++中的函数指针的思想密切相关.Java中是否有类似的功能?鉴于指针有点缺席,最好的方法是什么?要说清楚,我们在这里谈论头等舱.
对于一个类,我想在一个map存储std::function对象中存储一些函数指针到同一个类的成员函数.但是我在这个代码的开头就失败了:
class Foo {
public:
void doSomething() {}
void bindFunction() {
// ERROR
std::function<void(void)> f = &Foo::doSomething;
}
};
Run Code Online (Sandbox Code Playgroud)
我收到error C2064: term does not evaluate to a function taking 0 arguments的xxcallobj一些奇怪的模板实例化的错误结合.目前我正在使用Visual Studio 2010/2011在Windows 8上工作,在使用VS10的Win 7上工作也失败了.错误必须基于我不遵循的一些奇怪的C++规则.
编辑:我不使用提升.这是集成在MS编译器中的C++ 11.
我已经读过将函数指针转换为数据指针,反之亦然,但在大多数平台上都可以工作,但不能保证工作.为什么会这样?两者都不应该只是简单地址到主存储器中,因此兼容吗?
问题如下:考虑这段代码:
#include <iostream>
class aClass
{
public:
void aTest(int a, int b)
{
printf("%d + %d = %d", a, b, a + b);
}
};
void function1(void (*function)(int, int))
{
function(1, 1);
}
void test(int a,int b)
{
printf("%d - %d = %d", a , b , a - b);
}
int main (int argc, const char* argv[])
{
aClass a();
function1(&test);
function1(&aClass::aTest); // <-- How should I point to a's aClass::test function?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我如何使用a's aClass::test …
c++ arguments function-pointers parameter-passing pointer-to-member
如何获取类成员函数的函数指针,然后使用特定对象调用该成员函数?我想写:
class Dog : Animal
{
Dog ();
void bark ();
}
…
Dog* pDog = new Dog ();
BarkFunction pBark = &Dog::bark;
(*pBark) (pDog);
…
Run Code Online (Sandbox Code Playgroud)
另外,如果可能的话,我也想通过指针调用构造函数:
NewAnimalFunction pNew = &Dog::Dog;
Animal* pAnimal = (*pNew)();
Run Code Online (Sandbox Code Playgroud)
这是可能的,如果是这样,那么首选的方法是什么?
我无法弄清楚这一点:
int main() {
int (*) (int *) = 5;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的赋值用g ++ c ++ 11编译.我知道这int (*) (int *)是一个指向函数的指针,它接受一个(int *)as参数并返回一个int,但是我不明白你怎么能把它等同于5.起初我认为它是一个不断返回5的函数(来自我最近的学习) F#,可能,哈哈),然后我简单地想,函数指针指向内存位置5,但这显然不起作用,并且十六进制值也不行.
认为这可能是因为函数返回一个int,并且分配一个int是好的(不知何故),我也试过这个:
int * (*) (int *) = my_ptr
Run Code Online (Sandbox Code Playgroud)
where my_ptr是类型int *,与第二个函数指针的类型相同,如第一种类型为int的情况.这不编译.分配5或任何int值,而不是my_ptr,也不编译此函数指针.
那么作业是什么意思呢?
更新1
我们已经确认这是一个错误,如最佳答案所示.但是,仍然不知道您分配给函数指针的值实际发生了什么,或者赋值的情况.任何(好的)解释都将非常感谢!有关问题的详细说明,请参阅下面的编辑.
编辑1
我使用的是gcc版本4.8.2(在Ubuntu 4.8.2中)
编辑2
实际上,将它等同于我的编译器.甚至将它等同于std :: string变量,或者返回double的函数名,也可以.
编辑2.1
有趣的是,使它成为一个函数指针,指向任何返回不是指针的数据类型的函数,将让它进行编译,例如
std::string (*) () = 5.6;
Run Code Online (Sandbox Code Playgroud)
但是只要函数指针指向返回某个指针的函数,它就不会编译,例如with
some_data_type ** (*) () = any_value;
Run Code Online (Sandbox Code Playgroud) 我正在玩C++ lambdas以及它们对函数指针的隐式转换.我的开始示例是将它们用作ftw函数的回调.这按预期工作.
#include <ftw.h>
#include <iostream>
using namespace std;
int main()
{
auto callback = [](const char *fpath, const struct stat *sb,
int typeflag) -> int {
cout << fpath << endl;
return 0;
};
int ret = ftw("/etc", callback, 1);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
修改后使用捕获:
int main()
{
vector<string> entries;
auto callback = [&](const char *fpath, const struct stat *sb,
int typeflag) -> int {
entries.push_back(fpath);
return 0;
};
int ret = ftw("/etc", callback, 1);
for (auto entry : entries …Run Code Online (Sandbox Code Playgroud) 假设我有一个接受void (*)(void*)函数指针的函数用作回调函数:
void do_stuff(void (*callback_fp)(void*), void* callback_arg);
Run Code Online (Sandbox Code Playgroud)
现在,如果我有这样的功能:
void my_callback_function(struct my_struct* arg);
Run Code Online (Sandbox Code Playgroud)
我可以安全地这样做吗?
do_stuff((void (*)(void*)) &my_callback_function, NULL);
Run Code Online (Sandbox Code Playgroud)
我已经看过这个问题并且我已经看过一些C标准,它们说你可以转换为'兼容函数指针',但我找不到'兼容函数指针'的含义.
我想将一个函数指针设置为一个类的成员,该类是指向同一个类中另一个函数的指针.我这样做的原因很复杂.
在这个例子中,我希望输出为"1"
class A {
public:
int f();
int (*x)();
}
int A::f() {
return 1;
}
int main() {
A a;
a.x = a.f;
printf("%d\n",a.x())
}
Run Code Online (Sandbox Code Playgroud)
但这在编译时失败了.为什么?