본문 바로가기
개발/C, C++

C++ - map, functional로 함수 호출하기

by 피로물든딸기 2023. 11. 22.
반응형

C, C++ 전체 링크

 

string 명령어로 주어진 함수를 호출한다고 가정해 보자.

예를 들어 test2 함수를 호출하려면 아래와 같이 선언한다.

string cmd = "test2";

 

if / else를 이용하여 아래와 같이 함수를 호출할 수 있다.

#include <stdio.h>
#include <string>

using namespace std;

void test1()
{
	printf("%s\n", __FUNCTION__);
}

void test2()
{
	printf("%s\n", __FUNCTION__);
}

void test3()
{
	printf("%s\n", __FUNCTION__);
}

int main(void)
{
	string cmd = "test2";

	if (cmd.compare("test1") == 0) 
	{
		test1();
	}
	else if (cmd.compare("test2") == 0)
	{
		test2();
	}
	else if (cmd.compare("test3") == 0)
	{
		test3();
	}
	else
	{
		printf("wrong command!\n");
	}

	return 0;
}


functinal

 

functional과 map을 이용하면 string과 함수를 mapping할 수 있다.

예시는 다음과 같다.

map<string,function<void()>> cmdFunc;

cmdFunc.insert(make_pair("test1", test1));
cmdFunc.insert(make_pair("test2", test2));
cmdFunc.insert(make_pair("test3", test3));

 

함수를 호출할 때는 해당 string이 map에 존재하는지 확인 후 호출하면 더 안정적이다.

if (cmdFunc.find(cmd) != cmdFunc.end()) cmdFunc[cmd]();

 

전체 코드는 다음과 같다.

#include <stdio.h>
#include <string>
#include <map>
#include <functional>

using namespace std;

void test1()
{
	printf("%s\n", __FUNCTION__);
}

void test2()
{
	printf("%s\n", __FUNCTION__);
}

void test3()
{
	printf("%s\n", __FUNCTION__);
}

int main(void)
{
	string cmd = "test2";

	map<string,function<void()>> cmdFunc;

	cmdFunc.insert(make_pair("test1", test1));
	cmdFunc.insert(make_pair("test2", test2));
	cmdFunc.insert(make_pair("test3", test3));

	if (cmdFunc.find(cmd) != cmdFunc.end()) cmdFunc[cmd]();
	else 
	{
		printf("wrong command!\n");
	}

	return 0;
}

 

만약 함수에 parameter가 존재하는 경우라면 아래와 같이 선언하면 된다.

void test1(const string& input)
{
	printf("%s %s\n", __FUNCTION__, input.c_str());
}

int main(void)
{
	map<string,function<void(const string&)>> cmdFunc;

	...
    
	return 0;
}

 

전체 코드는 다음과 같다.

#include <stdio.h>
#include <string>
#include <map>
#include <functional>

using namespace std;

void test1(const string& input)
{
	printf("%s %s\n", __FUNCTION__, input.c_str());
}

void test2(const string& input)
{
	printf("%s %s\n", __FUNCTION__, input.c_str());
}

void test3(const string& input)
{
	printf("%s %s\n", __FUNCTION__, input.c_str());
}

int main(void)
{
	string cmd = "test2";
	string input = "input!!";

	map<string,function<void(const string&)>> cmdFunc;

	cmdFunc.insert(make_pair("test1", test1));
	cmdFunc.insert(make_pair("test2", test2));
	cmdFunc.insert(make_pair("test3", test3));

	if (cmdFunc.find(cmd) != cmdFunc.end()) cmdFunc[cmd](input);
	else 
	{
		printf("wrong command!\n");
	}

	return 0;
}

반응형

댓글