Вам следует избегать void*
, особенно при попытке использовать указатели функций. Я предполагаю, что вы смотрите только на указатели на функции-члены в классе myApp
, и что вас интересуют только указатели на функции-члены, которые принимают const std::vector<std::string> &args
в качестве аргумента. Этот typedef создаст соответствующий тип и назовет его MemFunType
typedef void (myApp :: * MemFunType) (const std::vector<std::string> &);
Вот полный пример (на ideone ), где вам могут быть интересны две различные функции-члена, TestFn
и TestFnBackwards
. Этот пример, вероятно, не очень полезен, но он дает несколько примеров указателей на функции-члены.
#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 );
}