eibon 2 Denunciar post Postado Maio 10, 2009 Pasteninja: http://www.pasteninja.com/paste/2310 #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; template<class T> void menu(vector<T> options, vector<void (*)(T)> funcVector); void locationFunction(string str); void pipelineFunction(string str); int main() { vector<string> menuOptions; vector<void (*)(string)> funcVector; menuOptions.push_back("Location"); menuOptions.push_back("Pipeline"); void (*funcPtr1)(string); void (*funcPtr2)(string); funcPtr1 =& locationFunction; funcPtr2 =& pipelineFunction; funcVector.push_back(funcPtr1); funcVector.push_back(funcPtr2); menu<string>(menuOptions, funcVector); return 0; } template<class T> void menu(vector<T> options, vector<void (*)(T)> funcVector){ if(funcVector.size() != options.size()) return; typename vector<T>::iterator begin = options.begin(); typename vector<T>::iterator end = options.end(); typename vector<T>::iterator it; cout << "What information would you enter?\n"; for(it = begin;it < end;it++){ cout << (*it) << "\n"; } cout << "--------" << endl; T chosen; cin >> chosen; sort(begin, end); int res = (lower_bound(begin, end, chosen) - begin); if(res > static_cast<int>(options.size())) menu(options, funcVector); else (funcVector.at(res))(chosen); } void locationFunction(string str){ cout << "Location function" << endl; } void pipelineFunction(string str){ cout << "Pipeline function" << endl; } Queria saber como simplificar da linha 19 à 24 (dar um push_back direto na referencia à função ao invés de fazer um ponteiro e tal...). Valew! Ps: não reparem...source tosco de ex prum amigo americano. Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Maio 11, 2009 Pode fazer assim: funcVector.push_back(&locationFunction); funcVector.push_back(&pipelineFunction); Compartilhar este post Link para o post Compartilhar em outros sites
eibon 2 Denunciar post Postado Maio 11, 2009 É eu tinha tentado isso,mas por alguma razão não tinha funcionado.Que vacilo...-.- Mas também,na hora tava sem tempo...ai já viu né... #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; template<class T> void menu(vector<T> options, vector<void (*)(T)> funcVector); void locationFunction(string str); void pipelineFunction(string str); void equipmentFunc(string str); int main() { vector<string> menuOptions; vector<void (*)(string)> funcVector; menuOptions.push_back("Location"); menuOptions.push_back("Pipeline"); menuOptions.push_back("Equipment"); funcVector.push_back(&locationFunction); funcVector.push_back(&pipelineFunction); funcVector.push_back(&equipmentFunc); menu<string>(menuOptions, funcVector); return 0; } template<class T> void menu(vector<T> options, vector<void (*)(T)> funcVector){ if(funcVector.size() != options.size()) return; typename vector<T>::iterator begin = options.begin(); typename vector<T>::iterator end = options.end(); typename vector<T>::iterator it; cout << "What information would you enter?\n"; for(it = begin;it < end;it++){ cout << (*it) << "\n"; } cout << "--------" << endl; T chosen; cin >> chosen; unsigned int res = (find(begin, end, chosen) - begin); if(res == options.size()) menu<T>(options, funcVector); (funcVector.at(res))(chosen); } void locationFunction(string str){ cout << "Location function" << endl; } void pipelineFunction(string str){ cout << "Pipeline function" << endl; } void equipmentFunc(string str){ cout << "Equipment function" << endl; } Perfeito!Valew! Tinha uns errinhos...mas nada que uma correçãozinha não arrume! Ps: porque puis um sort ali? -.-...q raiva... Compartilhar este post Link para o post Compartilhar em outros sites