Archief - [PROG]-[C++] Strings en functies

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

wlibaers

Legacy Member
Nog een optie, als je er iets tegen hebt om de naam twee keer te moeten intikken ;)

Code:
#include <string>
#include <map>
#include <iostream>

	
void f1()
{
	std::cout << "\nf1 gekozen\n\n";
}

void f2()
{
	std::cout << "\nf2 gekozen\n\n";
}

bool bstop = false;

void stop()
{
	bstop = true;
}

#define NIEUWCOMMANDO(x) commandolijst[#x] = x

int main()
{
	std::string commando;
	std::map<std::string, void (*)()> commandolijst;
	NIEUWCOMMANDO(f1);
	NIEUWCOMMANDO(f2);
	NIEUWCOMMANDO(stop);

	while (bstop == false)
	{
		std::cout << "geef commando\n";
		std::cin >> commando;
		if (commandolijst.find(commando)!=commandolijst.end())
			commandolijst[commando]();
		else
			std::cout << "\nOngeldig!\n\n";
	}
	return 0;
}

Werkt uiteraard alleen als functie en commando identiek zijn, en bekend tijdens de compilatie.

Kipp^Smith

Legacy Member
Schitterend! Merci!

Nog twee vragen:

1. Waarom die (*) bij void in de map?
2. Waarom gebruikt ge altijd std:: ipv. "using namespace std"? Is er een verschil, of is het gewoon smaak?

Alvast bedankt!

wlibaers

Legacy Member
Kipp^Smith zei:
Schitterend! Merci!

Nog twee vragen:

1. Waarom die (*) bij void in de map?

Functiepointertype. Kijk, als je een functie schrijft, en je doet dit:
void * f1()
dan is dat een functie f die een pointer naar void (om het even wat dus) geeft. Als je dit doet:
void f2()
is het een functie die geen waarde geeft. Maar wat als je geen functie wil, maar een pointer naar een functie van type f2?
void (* pf)()
pf is dan een pointer naar een functie die geen waarde geeft. Het verschil met f1 zijn de haakjes. Nu, in die map template geef je geen variabelen als argumenten, maar gewoon types. Dus verwijder de variabelenaam en wat houd je over?
void (*)()

Waarmee nogmaals is aangetoond dat het typesysteem in C en C++ er af en toe een beetje bizar uitziet ;)

2. Waarom gebruikt ge altijd std:: ipv. "using namespace std"? Is er een verschil, of is het gewoon smaak?

Inderdaad gewoon smaak.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan