반응형
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;
}
반응형
'개발 > C, C++' 카테고리의 다른 글
C++ - 정수를 IP로 변환하기 (IP Converter for IPv4, IPv6, Integer, in_addr, in6_addr) (1) | 2023.11.28 |
---|---|
C++ - 연산자 오버로딩을 이용하여 구조체 출력하기 (cout with overloading) (0) | 2023.11.22 |
C++ - 폴더, 파일 관리 함수 정리 with sys/stat.h, dirent.h, fstream (0) | 2023.09.09 |
여러가지 나머지 연산 방법 테스트 (0) | 2023.08.15 |
C, C++ - 비트 교환 (Change Some Bits) (0) | 2023.08.15 |
댓글