Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

eibon

[Resolvido] Ponteiro de funções

Recommended Posts

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

Pode fazer assim:

 

funcVector.push_back(&locationFunction);
funcVector.push_back(&pipelineFunction);

Compartilhar este post


Link para o post
Compartilhar em outros sites

É 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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.