关于visual c ++:c ++ void * to function to a function

c++ void* to parameter to a function

我在一些图书馆有这个功能:

1
2
3
4
5
class myConsole
{
    void addCommand( std::string command, void* fn );
    ...
}

在我的班级里,我有这样的功能:

1
2
3
4
void myApp::TestFn( const std::vector<std::string> & args )
{
    // do something
}

在同一类中,我称之为:

1
2
3
4
void myApp::initApp( )
{
    myConsole::getSingleton( ).addCommand("FirstTest", &myApp::TestFn );
}

但这给了我一个错误:

error c2664 cannot convert parameter 2 from 'void(__thiscall
myApp::*)(const std::vector<_Ty>&)' to 'void *'

我怎么解决这个问题?

事先谢谢!


你解决不了这个问题。您不能可靠地将函数指针强制转换为void *和back。

(我建议您重新设计程序并保持EDCOX1 1);在C++中没有真正的需要。


您应该避免使用void*,尤其是在尝试使用函数指针时。我假设您只查看myApp类中的成员函数指针,并且您只对以const std::vector &args为参数的成员函数指针感兴趣。此typedef将创建适当的类型并将其命名为MemFunType

1
typedef void (myApp :: * MemFunType) (const std::vector<std::string> &);

这里有一个完整的例子(关于ideone),其中有两个您可能感兴趣的不同成员函数:TestFnTestFnBackwards。这个例子可能不是很有用,但它给出了一些成员函数指针的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<iostream>
#include<vector>
using namespace std;

struct myApp;

struct myConsole
{
        typedef void (myApp :: * MemFunType) (const std::vector<std::string> &);
            void addCommand( std::string command, MemFunType fn );
};

struct myApp {
        void TestFn( const std::vector<std::string> & args ) {
                cout <<" TestFn" << endl;
                for(std :: vector<std::string> :: const_iterator i = args.begin(); i!=args.end(); i++) {
                        cout << *i << endl;
                }
        }
        void TestFnBackwards( const std::vector<std::string> & args ) {
                cout <<" TestFnBackwards" << endl;
                for(std :: vector<std::string> :: const_reverse_iterator i = args.rbegin(); i!=args.rend(); i++) {
                        cout << *i << endl;
                }
        }
        static myApp & getSingleton();
} ma;
myApp& myApp :: getSingleton() {
        return ma;
}

void myConsole :: addCommand( std::string , MemFunType fn ) {
        vector<string> words;
        words.push_back("hello");
        words.push_back("world");
        myApp &ma = myApp :: getSingleton();
        (ma.*fn)(words); // execute the member on the singleton object, using the words as the argument.
}

int main() {
        myConsole m;
        m.addCommand("FirstTest", &myApp::TestFn );
        m.addCommand("FirstTest", &myApp::TestFnBackwards );
}


这里的问题是,您试图传递一个类方法,因为它是一个void *指针。这是不可能的。

正确的方法是使用void addCommand (std::string, void *)方法的模板。类似的东西

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class myConsole {
    template <typename T>
    void addCommand( std::string command, T f);
};

struct Callback {
    myApp &app;
    Callback (myApp &a) : app(a) {
    }
    void operator() (const std::vector<std::string> &args) {
        app.TestFn(args);
    }
};

void myApp::initApp( )
{
    myConsole::getSingleton( ).addCommand("FirstTest", Callback(*this) );
}

这给了C++中的回调原则,但是我认为您需要比这个解决方案更灵活的东西,因为您实际上想要自动选择由回调执行的命令(在这种情况下,EDCOX1(4))。