다른 함수에 인수로 넘길 함수의 서명은 매개변수 서명으로 결정되며 매개변수 명세는 함수 인수의 성격에 따라 정해지고 다른 함수에 함수를 인수로 넘기는 방법은 세 가지가 있다.
- 함수 포인터를 사용한다. 즉,함수 이름을 인수값으로 사용한다. 하지만 밑의 두가지 방법이 더욱 더 좋다
- 함수 객체를 인수로 전달
- 람다 표현식을 인수로 전달
함수 객체(종종 펑터(함수연산자)라고 부른다고한다)는 함수 호출 연산자 operator()()를 오버로딩 한 클래스의 객체를 말한다 함수 객체는 원시 함수 포인터를 사용하는것보다 더 효율적으로 함수를 다른함수에 인자로 전달하는 방법을 제공한다.
#include<iostream>
#include<iterator>
#include<memory>
#include<tchar.h>
#include<vector>
using namespace std;
class calc
{
public:
double a, b, c;
calc(double _a, double _b, double _c) : a(_a), b(_b), c(_c) {}
double first() { return a; }
double second() { return b; }
double three() { return c; }
};
class test
{
private:
public:
double operator()(double a, double b, double c) { return a * b * c; }
double operator()(calc& cal)
{
return cal.first()* cal.second()* cal.three();
}
};
int _tmain()
{
calc a(1, 2, 3);
test t;
cout << t(a) << endl;
}
람다 표현식은 익명 함수를 정의한다.
람다식에 이름을 붙혀서 사용하는 예제이다
int _tmain()
{
auto cube = [](double a, double b) {return a * a * b; };
cout << cube(2,3) << endl;
}
람다 표현식을 함수에 전달해보자
template<typename ST,typename T>
void cal(ST a,ST b ,T fun)
{
for (auto iter = a;iter != b;iter++)
{
*iter = fun(*iter);
}
}
int _tmain()
{
int a[] = { 1,2,3,4,5,6 };
cal(begin(a), end(a), [](int value) {return value * value; });
cout << *(a+5) << endl;
}
funcational 헤더 사용법을 모르겠따...
람다 소개자의 []가 항상 비어있는건 아니다 [=]을 넣으면 람다함수로부터 외부에있는 변수들의 값들을 복사해올수 있다.
[&]로 쓰면 참조를 해온다. 그리고 [=,&test]로 쓰면 &는 참조로 접근하고 그 이외의 것들은 다 복사해온다
[&,test]을 넣으면 된다
람다 표현식의 문법 구성
[캡처 목록] (매개변수_목록) mutable 반환타입 {본문}
캡쳐목록 : 람다 표현식의 바깥 범위에서 캡쳐 할 변수목록, 변수값이나 참조로 캡쳐가능~
매개변수 목록 : 람다가 호출될 때 람다에 표현식에서 넘겨받을 매개변수 목록
mutable : 값으로 캡쳐한 바깥 변수의 복제본을 수정 가능으로 표시하는 키워드로 생략가능
반환타입 : 생략가능하며 생략하면 return시 자동으로 반환형을 바꾼다 아무것도 안할시 void다
본문 : 그냥 말 그대로 본문이드아!
class Root
{
public:
double operator()(double x) { return sqrt(x); }
};
int _tmain() {
Root root;
double data[]{ 1.5,2.5,3.5,4.5,5.5 };
// 함수 객체를 전달하기
cout << "square roots are: " << endl;
transform(begin(data), end(data), ostream_iterator<double>(cout, " "), root);
//람다 표현식을 인수로 사용하기
cout << "\n\nCubes are: " << endl;
transform(begin(data), end(data), ostream_iterator<double>(cout, " "), [](double x) {return x * x * x; });
//std::function<> 타입의 변수를 인수로 사용하기
function<double(double)>op{ [](double x) {return x * x; } };
cout << "\n\nSquares are : " << endl;
transform(begin(data), end(data), ostream_iterator<double>(cout, " "), op);
//다른 람다 표현식을 호출하는 람다 표현식을 인수로 사용하기
cout << "\n\n4th powers are: " << endl;
transform(begin(data), end(data), ostream_iterator<double>(cout, " "), [&op](double x) {return op(x) * op(x); });
cout << endl;
}
'IT책 > C++14 STL 철저 입문' 카테고리의 다른 글
1.7 알고리즘 (0) | 2019.06.26 |
---|---|
1.6 스마트 포인터 (0) | 2019.06.25 |
1.4~5 반복자 (0) | 2019.06.25 |
1.3 컨테이너 (0) | 2019.06.24 |