相关疑难解决方法(0)

C++:指向虚拟成员函数的单态版本的指针?

在C++中,可以获得指向类的(非静态)成员函数的指针,然后在对象上调用它.如果函数是虚函数,则根据对象的动态类型动态调度调用.通过显式提供包含要使用的版本的范围,也可以(不使用成员指针)以单态方式调用对象的虚拟成员函数.以下代码演示了这一点:

#include <iostream>
using std::cout; using std::endl;

struct Foo
{
    virtual void foo() { cout << 1 << endl; }
};

struct Foo2: public Foo
{
    virtual void foo() { cout << 2 << endl; }
};

int main( int, char** )
{
    Foo *foo = new Foo2;

    void (Foo::*foo_pointer)() = &Foo::foo;

    foo->foo();            // prints 2
    foo->Foo::foo();       // prints 1
    (foo->*foo_pointer)(); // prints 2
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是将两者结合起来,并获得指向成员函数的单态版本的指针; 即,我想要一个指向Foo :: foo的指针,它总是调用foo的基类版本,并打印1,即使它是在Foo2上调用的.但是,我还没有找到办法做到这一点.可能吗?

(除了编写一个新的非虚函数的繁琐的手动方式,它进行单态调用,然后获得指向它的指针.)

c++ virtual-functions member-function-pointers

27
推荐指数
1
解决办法
1551
查看次数

在void*和指向成员函数的指针之间进行转换

我目前正在使用GCC 4.4,而且我之间void*有一个令人头痛的问题,并且指向成员函数.我正在尝试编写一个易于使用的库,用于将C++对象绑定到Lua解释器,如下所示:

LuaObject<Foo> lobj = registerObject(L, "foo", fooObject);
lobj.addField(L, "bar", &Foo::bar);
Run Code Online (Sandbox Code Playgroud)

我已经完成了大部分工作,除了以下函数(特定于某个函数签名,直到我有机会对其进行概括):

template <class T>
int call_int_function(lua_State *L) 
{
    // this next line is problematic
    void (T::*method)(int, int) = reinterpret_cast<void (T::*)(int, int)>(lua_touserdata(L, lua_upvalueindex(1)));
    T *obj = reinterpret_cast<T *>(lua_touserdata(L, 1));

    (obj->*method)(lua_tointeger(L, 2), lua_tointeger(L, 3));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于那些不熟悉Lua的人,lua_touserdata(L, lua_upvalueindex(1))获取与闭包相关的第一个值(在这种情况下,它是指向成员函数的指针)并将其作为a返回void*.海湾合作委员会抱怨说void*- > void (T::*)(int, int)是无效的演员.关于如何解决这个问题的任何想法?

c++ lua pointers pointer-to-member

13
推荐指数
3
解决办法
2万
查看次数

如何使用std :: bind()来调用基类的虚函数版本?

我试图使用std :: bind()来创建一个函数,该函数将调用虚函数的基类版本,而不是调用派生类的版本.

struct Base
{
    virtual void foo() { cout << "Base\n"; }
};

struct Derived : public Base
{
    virtual void foo() { cout << "Derived\n"; }
};

int main(int argc, const char * argv[])
{
    Base* base = new Derived;
    auto baseMethodHopefully = std::bind( &Base::foo, base );
    baseMethodHopefully();    // Want call to Base::foo(), but get call to Derived::foo().

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我从其他地方了解到你通常不能以"反虚拟"方式调用基本功能,例如这样.一个明显的例外是常见的范例:

void Derived::bar() { Base::bar(); }
Run Code Online (Sandbox Code Playgroud)

由于表达Base::bar()被认定为"反虚"(在这个意义上,我暗指)派生的方法中,是可以绑定到Base::bar()从希望的方式源性的方法之一?例如:

void …
Run Code Online (Sandbox Code Playgroud)

c++ virtual-functions bind member-function-pointers c++11

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