2

我目前正在学习 C++,并且在转换指针方面遇到了一些问题。首先,我不确定我正在尝试做的事情就是我想做的事情。

我正在尝试采用一个函数,该函数可以根据字符串参数将适当的指针返回到各种方法指针,然后使用方法指针。

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

typedef void* (*plugin_function)(void*);

static class Plugin
{
public:
    static bool doBoolStuff(){
        return true;// A Simple function that returns true
    }
};

void* getFunction(string pluginName, string functionName)
{
    if(pluginName =="Bool"){
        return &Plugin::doBoolStuff;
            //If the string is right it should return a method pointer.
            //I think that void* has the ability to point to anything, I am trying
            //to use that functionality to create a system where I am able to set 
            //some parameters and get the appropriate method pointer.
    }else{
        return NULL;
    }
}

int main(int argc, _TCHAR* argv[])
{
    void* pluginFunction;
    pluginFunction = getFunction("Bool","");

    if(pluginFunction == &Plugin::doBoolStuff)cout<<"CastSuccesful!"<<endl;

    //This section right here is where my code is breaking.
    //
    // IntelliSense: expression preceding parentheses of apparent call must have              
    //(pointer-to-) function type   
    //c:\Users\Walter\Dropbox\Inscription\MethodCasting\MethodCasting\MethodCasting.cpp 
    //MethodCasting

    cout << "Bool function ->"<< pluginFunction()<<endl;
    cout << "--------------------------------"<<endl;
    system("pause");

}

任何反馈都会有所帮助。

4

2 回答 2

2

编辑:不是真的,对不起。正如@Stephen Lin 指出的那样,我没有阅读static修饰符......所以虽然你想要的对非静态成员函数不起作用,但它通常适用于静态成员使用reinterpret_cast(这种行为是实现定义的):

class Plugin {
    public:
    static bool foo()
    {
        std::cout << "Foo called!" << std::endl;
        return true;
    }
};

void *get_func()
{
    return reinterpret_cast<void *>(&Plugin::foo);
}

int main()
{
    void *pluginFunction = get_func();
    (reinterpret_cast<bool (*)()>(pluginFunction))();
    return 0;
}

原帖:


你不能。根据这篇文章

但是,没有办法将void *back 转换为您可以实际使用的成员函数指针。

我自己试过了。实际上,所有的static_castreinterpret_cast甚至是旧的 C 风格的转换都拒绝工作 - 无论是 with void *,还是 with bool (*)()(是的,我什至尝试从非成员函数指针类型转换为成员函数类型)......

抱歉,C++ 似乎不允许我们这样做。

于 2013-03-03T09:06:50.860 回答
0

这取决于你的实现,如果你能做到这一点。在可移植的 C++ 中你不能。即使可以,您也需要显式转换(在这种情况下reinterpret_cast<>)来在不同的指针类型之间进行转换。

请注意,这不会扩展到真正的“方法”指针,即非静态成员函数指针。您不能在成员函数指针和对象指针或普通函数指针之间进行转换。如果您只有非静态成员函数指针 ,则可以使用我最后介绍的方法。

Portablyreinterpret_cast<>可以在函数指针类型和对象指针类型之间自由转换——尽管在几乎所有情况下,除了转换回原始类型之外,对结果的任何使用都是未定义的。

对于对象指针类型和函数指针类型之间的转换,C++11 标准说(§5.2.10 [expr.reinterpret.cast]/8):

有条件地支持将函数指针转换为对象指针类型或反之亦然。这种转换的含义是实现定义的,除非实现支持双向转换,将一种类型的纯右值转换为另一种类型并返回,可能具有不同的 cv 限定,应产生原始指针值。

因此,它取决于您的实现(并且应该在其文档中记录),如果将函数指针强制转换为void *编译并返回编译。唉,如果是这样,你应该得到预期的行为。

在您的代码中缺少演员表。您需要转换为泛型类型(在您的情况下void*),getFunction并且您需要转换回原始类型才能调用该函数。所以你需要知道原始类型main()

void* pluginFunction = getFunction("Bool","");
// ....
cout << "Bool function ->"<< (reinterpret_cast<bool (*)()>(pluginFunction))()<<endl;

一个更便携的解决方案是使用任意函数指针类型,例如void (*)()传递插件函数指针,这样你就有:

typedef void (*any_func_ptr)();

// If you wanted to use this for non-static member functions, you could do
//   struct AnyClass;
//   typedef void (AnyClass::*any_memfun_ptr)();

any_func_ptr getFunction(string pluginName, string functionName)
{
    if(pluginName =="Bool"){
        return reinterpret_cast<any_func_ptr>(&Plugin::doBoolStuff);
    }else{
        return NULL;
    }
}

int main(int argc, char* argv[])
{
    any_func_ptr pluginFunction = getFunction("Bool","");

    if(reinterpret_cast<bool (*)()>(pluginFunction) == 
         &Plugin::doBoolStuff)
             cout<<"CastSuccesful!"<<endl;

    cout << "Bool function ->"<< (reinterpret_cast<bool (*)()>(pluginFunction))()<<endl;

}
于 2013-03-03T11:48:52.933 回答