본문 바로가기
Dev Language/Modern C++ (C++11, 14)

C++ 11 : 일급 함수 (1)다른 함수의 매개변수로 함수 전달

by 미티치 2020. 8. 8.

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 연산을 수행했다.