标签: member-function-pointers

C++ 0x lambda包装器与用于传递成员函数的bind

这基本上是关于创建/传递一个从类构造函数/方法中指向成员方法的仿函数的两种不同方法的可读性,样式和性能的问题.

方法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)的范围变得很困难,显然我们不打算包装我们打算立即调用的成员方法.

lambda bind member-function-pointers c++11

11
推荐指数
1
解决办法
3741
查看次数

指向会员代表的指针

我试图从成员函数做一些回调,一切都很好,直到我尝试使用从2个类派生的模板类作为回调对象时,我得到以下错误:

error C2440: 'reinterpret_cast' : Pointers to members have different representations; cannot cast between them
Run Code Online (Sandbox Code Playgroud)

这件事告诉我,成员函数指针有不同的表示形式(doh!)

这些陈述是什么?他们之间有什么区别?

c++ member-function-pointers function-pointers

11
推荐指数
2
解决办法
2429
查看次数

为什么获取成员函数指针值甚至需要从类内部进行类名限定?

当一个成员函数指针返回到该类的一个成员函数中的一个类时,我仍然需要指定该类.我不能简单地拿地址.例如,此代码工作正常:

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

11
推荐指数
1
解决办法
872
查看次数

如何调用指向成员的指针函数?

我收到了一个我不明白的编译错误(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.我在这里错过了什么?

c++ compiler-errors member-function-pointers

10
推荐指数
2
解决办法
2025
查看次数

如何将成员函数传递给函数指针?

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

10
推荐指数
1
解决办法
5695
查看次数

C++:使用带有成员函数的函数指针

我试图将一个函数作为参数传递给另一个函数,它们都碰巧是同一个类的成员函数.

我得到一个奇怪的错误,我无法弄清楚问题是什么.

这是我的功能:

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静态不是一个真正有效的选项.

c++ member-function-pointers function-pointers

10
推荐指数
1
解决办法
3014
查看次数

如何键入一个指向方法的指针,该方法返回一个指针方法?

基本上我有以下课程:

class StateMachine {
...
StateMethod stateA();
StateMethod stateB();
...
};
Run Code Online (Sandbox Code Playgroud)

stateA()和stateB()方法应该能够返回指向stateA()和stateB()的指针.如何输入定义StateMethod?

c++ member-function-pointers

9
推荐指数
2
解决办法
6919
查看次数

如何定义一般成员函数指针

我创建了一个Timer类,当计时器到期时必须调用一个回调方法.目前我使用普通函数指针(它们被声明为void(*)(void),当Elapsed事件发生时,函数指针被调用.

是否可以使用也具有签名void(AnyClass ::*)(void)的成员函数执行相同的操作?

谢谢你的队友.

编辑:此代码必须在Windows上以及在实时操作系统(VxWorks)上工作,因此不使用外部库会很棒.

EDIT2:只是为了确定,我需要的是有一个Timer类,它在构造函数中接受一个参数,不带参数,然后返回void的"AnyClass.AnyMethod".我必须存储这个参数,后者在代码中只执行此变量指向的方法.希望很清楚.

c++ member-function-pointers function-pointers

9
推荐指数
1
解决办法
2605
查看次数

c ++成员函数指针问题

我是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)

我的问题如下:

  1. 我在这段代码中做错了什么? …

c++ member-function-pointers

9
推荐指数
2
解决办法
4365
查看次数

成员函数指针和继承

我需要解决这个问题.有一个基类和两个继承的类.基类包含需要函数指针作为参数的方法.但是这些函数是在继承的类中定义的.

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)

c++ inheritance member-function-pointers

9
推荐指数
1
解决办法
945
查看次数