장점 :
- 다른 멤버 변수와 멤버 함수를 가질 수 있고 일반 함수에서 하지 못하는 지원을 받을 수 있습니다.
- 함수 객체의 서명이 같더라도 객체 타입이 다르면 서로 전혀 다른 타입으로 인식합니다.
- 일반 함수보다 빠릅니다.
- 인라인 될 수 있고(함수가 있어야 하므로 인라인 함수의 복사본 함수를 만들어 냄) 컴파일러가 쉽게 최적화 할 수 있습니다.
템플릿
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 |