ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1064) N
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (177)
      • Unreal (69)
      • Unity (97)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221) N
      • 공통 (7)
      • 프로그래머스 (22) N
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • c#
  • 언리얼
  • 함수
  • string
  • 배열
  • 백준
  • 오블완
  • 파이썬
  • C++
  • 알고리즘
  • C
  • 프로그래머스
  • 그래픽스
  • 클래스
  • SQL
  • 문자열
  • 포인터
  • Unity
  • 유니티
  • 티스토리챌린지

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

C++ 함수 객체 (Fuction Object) 템플릿 / 람다식
프로그래밍 언어/C++

C++ 함수 객체 (Fuction Object) 템플릿 / 람다식

2022. 6. 6. 23:46

장점 :

  1. 다른 멤버 변수와 멤버 함수를 가질 수 있고 일반 함수에서 하지 못하는 지원을 받을 수 있습니다.
  2. 함수 객체의 서명이 같더라도 객체 타입이 다르면 서로 전혀 다른 타입으로 인식합니다.
  3. 일반 함수보다 빠릅니다. 
  4. 인라인 될 수 있고(함수가 있어야 하므로 인라인 함수의 복사본 함수를 만들어 냄) 컴파일러가 쉽게 최적화 할 수 있습니다.

템플릿

enum class e_operation_type
{
    ADD,
    SUB,
    MUL,
    DIV,
    MAX
};
 
template<typename T>
class Template_function_obj
{
public:
    void operator()(e_operation_type _operation_type, T _lval, T _rval)
    {
        switch (_operation_type)
        {
        case e_operation_type::ADD: cout << "덧셈값 : " << to_string(_lval + _rval) << endl; break;
        case e_operation_type::SUB: cout << "뺄셈값 : " << to_string((_lval > _rval) ? (_lval - _rval) : (_rval - _lval)) << endl; break;
        case e_operation_type::MUL: cout << "곱셈값 : " << to_string(_lval * _rval) << endl; break;
        case e_operation_type::DIV: cout << "나눗셈값 : " << to_string((_lval > _rval) ? (_lval / _rval) : (_rval / _lval)) << endl; break;
 
        case e_operation_type::MAX: 
        default:
            break;
        }
    }
};
 
template<typename T = int>
void Test_msg(T& _val1, T& _val2)
{
    cout << "첫번째 숫자를 입력하세요. "; cin >> _val1;
    cout << "두번째 숫자를 입력하세요. "; cin >> _val2;
    cout << "테스트 중 / 값1 : " << _val1 << " 값2 : " << _val2 << endl;
}
 
int main()
{
    Template_function_obj<int>   int_function_obj;
    Template_function_obj<float> float_function_obj;
    int val1, val2;
 
    // int형 테스트
    Test_msg(val1, val2);
    int_function_obj(e_operation_type::ADD, val1, val2);
    int_function_obj(e_operation_type::SUB, val1, val2);
    int_function_obj(e_operation_type::MUL, val1, val2);
    int_function_obj(e_operation_type::DIV, val1, val2);
 
    // float형 테스트
    float float_val1, float_val2;
    cout << endl;
    Test_msg(float_val1, float_val2);
    float_function_obj(e_operation_type::ADD, float_val1, float_val2);
    float_function_obj(e_operation_type::SUB, float_val1, float_val2);
    float_function_obj(e_operation_type::MUL, float_val1, float_val2);
    float_function_obj(e_operation_type::DIV, float_val1, float_val2);
 
    return 0;
}

결과

람다식

class Function_obj
{
public:
    void operator()(std::function<void(int,int)> fn_ptr)
    {
        fn_ptr(5, 4);
    }
};
 
void Test_fn_obj()
{
    Function_obj function_obj;
    
    function_obj([](int a, int b)
        {
            cout << "덧셈값 : " << a + b << endl;
        });
 
    function_obj([](int a, int b)
        {
            cout << "뺄셈값 : " << a - b << endl;
        });
 
    function_obj([](int a, int b)
        {
            cout << "곱셈값 : " << a * b << endl;
        });
 
    function_obj([](int a, int b)
        {
            cout << "나눗셈값 : " << a / b << endl;
        });
}
 
int main()
{
    Test_fn_obj();
    return 0;
}

결과

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ 캐스팅 static_cast / reinterpret_cast 예제  (0) 2022.06.10
C++ SFINAE 여러 타입에 대응하는 템플릿 오버로딩  (0) 2022.06.10
C++ 콜백 CallBack 함수  (0) 2022.06.09
C++ 유니폼 초기화와 생성자  (0) 2022.06.07
C++ 11 버전 주 기능  (0) 2022.06.05
    '프로그래밍 언어/C++' 카테고리의 다른 글
    • C++ SFINAE 여러 타입에 대응하는 템플릿 오버로딩
    • C++ 콜백 CallBack 함수
    • C++ 유니폼 초기화와 생성자
    • C++ 11 버전 주 기능
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바