Gautam Naresh Ответов: 2

C++ как сопоставить с int и function?


void tall()
{
   ....
}
void call()
{
   ....
}

typedef std::map<uint32_t, void(*)()>function;
function menu = {
	{1, [](){tall();}},
	{2, [](){call();}},
};

int main()
{
 int a;
  cout<<"choose menu [1~2]"<<endl;
  cin>>a;
   auto it= menu.begin();
	for(; it !=  menu.end(); it++) {
		if(it->first == a) {
            it->second;
            break;
		}
	}
	if(it==menu.end()){
	    cout<<a<<" menu not found"<<endl;
	}
  
	
    return 0;
}


Что я уже пробовал:

я попробовал выше код, сборка удалась, но не работает должным образом.
Помоги мне.

2 Ответов

Рейтинг:
7

Shao Voon Wong

Функции должны быть указаны с указанием их адреса с помощью & .

typedef std::map<uint32_t, void(*)()> function;
function menu = {
	{1, &tall },
	{2, &call },
};

Вызовите функцию с круглыми скобками следующим образом: it->second()

Эта функция может быть вызвана непосредственно из меню, например menu[a]() если вы убедитесь, что a либо 1 или 2 другими словами, в пределах menu граница.

#include <iostream>
#include <map>

void tall()
{
	std::cout << "tall() called\n";
}

void call()
{
	std::cout << "call() called\n";
}

typedef std::map<uint32_t, void(*)()> function;
function menu = {
	{1, &tall },
	{2, &call },
};

int main()
{
	uint32_t a;
	std::cout << "choose menu [1~2]" << std::endl;
	std::cin >> a;

	if(a >= 1 && a <= 2)
		menu[a]();
	else
	{
		std::cout << a << " menu not found" << std::endl;
	}


	return 0;
}


CPallini

5.

Shao Voon Wong

Спасибо! Ваш ответ получил и мои 5!

CPallini

Так что, вам тоже спасибо :-)

Рейтинг:
14

CPallini

Цитата:
Для(; к != меню.конец(); это++) {
if(it->first == a) {
это->второй; // <-- это должно быть: оно->второе();
перерыв;
}

Приведенная выше коррекция исправит ваш код.
Примечание Вы можете написать это так
#include <iostream>
#include <map>
using namespace std;

void tall()
{
   cout << "tall\n";
}
void call()
{
   cout << "call\n";
}

using function =  std::map<uint32_t, void(*)()>;

function menu =
{
  {1, [](){tall();}},
  {2, [](){call();}},
};

int main()
{
  uint32_t a;
  cout << "choose menu [1~2]" << endl;
  cin >> a;
  auto it = menu.find(a);
  if ( it != menu.end() )
    it->second();
  else
    cout << a << " menu not found" << endl;
}


или, как вариант
#include <iostream>
#include <map>
#include <functional>
using namespace std;

void tall()
{
   cout << "tall\n";
}
void call()
{
   cout << "call\n";
}

std::map<uint32_t, function<void()> > menu =
{
  {1, tall},
  {2, call},
};

int main()
{
  uint32_t a;
  cout << "choose menu [1~2]" << endl;
  cin >> a;
  auto it = menu.find(a);
  if ( it != menu.end() )
    it->second();
  else
    cout << a << " menu not found" << endl;
}