这基本上是关于创建/传递一个从类构造函数/方法中指向成员方法的仿函数的两种不同方法的可读性,样式和性能的问题.
方法1:
using namespace std::placeholders;
std::bind( &MyClass::some_method, this, _1, _2, _3 )
Run Code Online (Sandbox Code Playgroud)
方法2:
[ this ](const arg1& a, arg2 b, arg3& c) -> blah { some_method( a, b, c ); }
Run Code Online (Sandbox Code Playgroud)
我想知道在这种情况下使用lambda是否是无偿的,在某些方面它更容易看到发生了什么,但是你必须明确地提供arg类型.此外,我更喜欢不使用"使用命名空间;" 但是它使得绑定表达式不必要地冗长(例如._1变成std :: placeholders :: _ 1),而lambda避免了这个问题.
最后我应该注意到,出于这个问题的目的,some_method是一个很大的功能,可以做很多事情,并且直接复制到lambda体内会很痛苦.
如果这个问题看起来太模糊,那么我们可以专注于性能差异的答案,如果有的话.
编辑:一个非平凡的用例.
MyClass::MyClass()
: some_member_( CALLBACK_FUNCTOR )
{}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,初始化列表中使用的CALLBACK_FUNCTOR(使用方法1或2定义)使得使用声明(afaik)的范围变得很困难,显然我们不打算包装我们打算立即调用的成员方法.
我试图从成员函数做一些回调,一切都很好,直到我尝试使用从2个类派生的模板类作为回调对象时,我得到以下错误:
error C2440: 'reinterpret_cast' : Pointers to members have different representations; cannot cast between them
Run Code Online (Sandbox Code Playgroud)
这件事告诉我,成员函数指针有不同的表示形式(doh!)
这些陈述是什么?他们之间有什么区别?
当一个成员函数指针返回到该类的一个成员函数中的一个类时,我仍然需要指定该类.我不能简单地拿地址.例如,此代码工作正常:
class Foo {
public:
void func(int param) { cout << param << endl; }
void (Foo::*getPointer())(int) { return &Foo::func; }
};
Run Code Online (Sandbox Code Playgroud)
但如果在getPointer我尝试简单地做:return &func我得到这个错误:
prog.cpp:在成员函数'
void (Foo::* Foo::getPointer())(int)':
prog.cpp:8:43:错误:ISO C++禁止获取非限定或带括号的非静态成员函数的地址,以形成指向成员函数的指针.说'&Foo::func'[-fpermissive]
void (Foo::*getPointer())(int) { return &func; }
为什么我必须在我所在的上下文中指定类?
c++ methods member-function-pointers function-pointers dereference
我收到了一个我不明白的编译错误(MS VS 2008).在弄乱了好几个小时之后,这一切都很模糊,我觉得有一些非常明显(而且非常愚蠢)的东西,我很想念.这是基本代码:
typedef int (C::*PFN)(int);
struct MAP_ENTRY
{
int id;
PFN pfn;
};
class C
{
...
int Dispatch(int, int);
MAP_ENTRY *pMap;
...
};
int C::Dispatch(int id, int val)
{
for (MAP_ENTRY *p = pMap; p->id != 0; ++p)
{
if (p->id == id)
return p->pfn(val); // <--- error here
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器在箭头处声称"术语不评估为采用1参数的函数".为什么不?PFN原型为带有一个参数的函数,MAP_ENTRY.pfn是PFN.我在这里错过了什么?
class Child;
class Parent
{
public:
void (*funcPointer)();
void (*funcPointer2)(Parent* _this);
void (Child::*funcPointer3)();
};
class Child: public Parent
{
public:
void TestFunc(){
}
void Do(){
Parent p;
p.funcPointer=TestFunc; // error, '=': cannot convert from 'void (__thiscall Child::* )(void)' to 'void (__cdecl *)(void)'
p.funcPointer2=TestFunc; // error too, '=': cannot convert from 'void (__thiscall Child::* )(void)' to 'void (__cdecl *)(Parent *)'
p.funcPointer3=TestFunc; //this works
p.funcPointer3=&Child::TestFunc; // this works too.
p.funcPointer3(); // error, term does not evaluate to a function taking 0 arguments …Run Code Online (Sandbox Code Playgroud) c++ methods member-function-pointers function-pointers delayed-execution
我试图将一个函数作为参数传递给另一个函数,它们都碰巧是同一个类的成员函数.
我得到一个奇怪的错误,我无法弄清楚问题是什么.
这是我的功能:
void myClass::functionToPass()
{
// does something
}
void myClass::function1(void (*passedFunction)())
{
(*passedFunction)();
}
void myClass::function2()
{
function1( &myClass::functionToPass );
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
cannot convert parameter 1 from 'void(__thiscall myClass::*) (void)'
to 'void(__cdecl*)(void)'
Run Code Online (Sandbox Code Playgroud)
什么给出了什么?我觉得我已尝试过各种变化,试图让它发挥作用.你甚至可以传递成员函数的函数指针吗?我怎样才能让它发挥作用?
注意:使functionToPass静态不是一个真正有效的选项.
基本上我有以下课程:
class StateMachine {
...
StateMethod stateA();
StateMethod stateB();
...
};
Run Code Online (Sandbox Code Playgroud)
stateA()和stateB()方法应该能够返回指向stateA()和stateB()的指针.如何输入定义StateMethod?
我创建了一个Timer类,当计时器到期时必须调用一个回调方法.目前我使用普通函数指针(它们被声明为void(*)(void),当Elapsed事件发生时,函数指针被调用.
是否可以使用也具有签名void(AnyClass ::*)(void)的成员函数执行相同的操作?
谢谢你的队友.
编辑:此代码必须在Windows上以及在实时操作系统(VxWorks)上工作,因此不使用外部库会很棒.
EDIT2:只是为了确定,我需要的是有一个Timer类,它在构造函数中接受一个参数,不带参数,然后返回void的"AnyClass.AnyMethod".我必须存储这个参数,后者在代码中只执行此变量指向的方法.希望很清楚.
我是c ++的新手.我想知道对象指针和指向成员函数的指针.我写了一个代码如下:
代码:
#include <iostream>
using namespace std;
class golu
{
int i;
public:
void man()
{
cout<<"\ntry to learn \n";
}
};
int main()
{
golu m, *n;
void golu:: *t =&golu::man(); //making pointer to member function
n=&m;//confused is it object pointer
n->*t();
}
Run Code Online (Sandbox Code Playgroud)
但是当我编译它时,它显示了两个错误,其中包括:
pcc.cpp: In function ‘int main()’:
pcc.cpp:15: error: cannot declare pointer to ‘void’ member
pcc.cpp:15: error: cannot call member function ‘void golu::man()’ without object
pcc.cpp:18: error: ‘t’ cannot be used as a function.
Run Code Online (Sandbox Code Playgroud)
我的问题如下:
我需要解决这个问题.有一个基类和两个继承的类.基类包含需要函数指针作为参数的方法.但是这些函数是在继承的类中定义的.
class CBase;
typedef bool (CBase::*FPredicate)();
class CBase
{
public:
CBase() {}
~CBase() {}
protected:
//this method waits until 'predicate' is true or until 'timeout' ms. passed
//and returns true if 'predicate' is true eventually
bool WaitEvent(FPredicate predicate, int timeout)
{
bool result = false;
int time1 = GetTickCount();
int time2;
bool isEnd = false;
while(!isEnd)
{
result = isEnd = (this->*predicate)();
time2 = GetTickCount();
if(time2 - time1 > timeout && !isEnd)
isEnd = true;
}
return result;
}
}; …Run Code Online (Sandbox Code Playgroud)