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 *'
我怎么解决这个问题?
事先谢谢!
你解决不了这个问题。您不能可靠地将函数指针强制转换为
(我建议您重新设计程序并保持EDCOX1 1);在C++中没有真正的需要。
您应该避免使用
1 | typedef void (myApp :: * MemFunType) (const std::vector<std::string> &); |
这里有一个完整的例子(关于ideone),其中有两个您可能感兴趣的不同成员函数:
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 ); } |
这里的问题是,您试图传递一个类方法,因为它是一个
正确的方法是使用
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))。