std::function 은 호출 가능한 함수, 람다 표현식, 또는 다른 함수 객체, 멤버 함수에 대한 포인터, 멤버 변수에 대한 포인터 등을 저장, 복사, 호출할 때 사용한다.
typedef 키워드는 다른 타입이나 함수에 대한 별칭을 정의할 때 사용한다.
// ConsoleApplication1.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//
#include "pch.h"
#include <iostream>
#include <tchar.h>
#include <stdio.h>
#include <functional> // <- this one!
/*
두 개의 int 타입 변수를 받아서, return int 하는 FuncType 함수 타입 정의
- C++ 98에서 함수 포인터 생성 방식으로는 typedef int (WINAPI *FuncType)(int nparamA, int nparamB); 이었다.
- std::function 을 사용하기 위해 functional 을 include 함을 보여주기 위해 명시적으로 using namespace std; 를 뒤로 뺐다.
*/
typedef std::function<int(int, int)> FuncType;
using namespace std;
/*
실제 함수 구현들
*/
int addition(int x, int y)
{
return x + y;
}
int substraction(int x, int y)
{
return x - y;
}
int multiplication(int x, int y)
{
return x * y;
}
int division(int x, int y)
{
if (y > 0)
return x / y;
else
return -1;
}
/*
함수 포인터를 매개변수로 받는 함수 정의
*/
void PassingFunc(FuncType fn, int x, int y)
{
cout << "Result = " << fn(x, y) << endl;
}
auto main() -> int
{
int whichFunc, a, b = 0;
FuncType func;
cout << "User : Select Mode choise!" << endl;
cout << "1. Addition" << endl;
cout << "2. Subtraction" << endl;
cout << "3. Multiplication" << endl;
cout << "4. Division" << endl;
cin >> whichFunc;
/*
사용자 입력 값이 유효한지 확인
- cin 객체를 통해서 받은 사용자 입력 값이 정상적이지 않은 경우 : 예를 들면 int 가 아닌 값을 받는 경우 (자료형 불일치)
- cin 객체 내부의 failbit 가 설정됨 (내부 상태 플래그)
- failbit 가 설정되면 cin.fail() 함수가 true 리턴
*/
while ( cin.fail())
{
cin.clear(); // failbit clear -> cin 객체를 사용 가능한 상태로 바꾸어줌. clear 안하면 failbit 계속 설정되어 있음
cout << "You can only enter numbers.\n" << endl;
}
cout << "User : enter Parameter a = " << endl;
cin >> a;
while (cin.fail())
{
cin.clear(); // failbit clear -> cin 객체를 사용 가능한 상태로 바꾸어줌. clear 안하면 failbit 계속 설정되어 있음
cout << "You can only enter numbers.\n" << endl;
}
cout << "User : enter Parameter b = " << endl;
cin >> b;
while (cin.fail())
{
cin.clear(); // failbit clear -> cin 객체를 사용 가능한 상태로 바꾸어줌. clear 안하면 failbit 계속 설정되어 있음
cout << "You can only enter numbers.\n" << endl;
}
/*
PassingFunc 함수의 매개변수로 정의된 함수 포인터를 전달
*/
switch ( whichFunc )
{
case 1:
PassingFunc(addition, a, b);
break;
case 2:
PassingFunc(substraction, a, b);
break;
case 3:
PassingFunc(multiplication, a, b);
break;
case 4:
PassingFunc(division, a, b);
break;
}
return 1;
}
1024 * 2 연산을 수행했다.
'Dev Language > Modern C++ (C++11, 14)' 카테고리의 다른 글
C++ 11 : default, delete 키워드 (0) | 2020.08.08 |
---|---|
C++ 11 : 지연 평가 (0) | 2020.08.08 |
C++ 11 : 열거타입 enum (0) | 2020.08.08 |
C++ 11 : nullptr (0) | 2020.08.08 |
C++ 11 : std::function 함수 객체? 함수면 함수고 객체면 객체인데, 함수 객체는 무엇인가 ? (0) | 2020.08.08 |