본문 바로가기

IT책/C++14 STL 철저 입문

1.8 함수를 인수로 전달하기

다른 함수에 인수로 넘길 함수의 서명은 매개변수 서명으로 결정되며 매개변수 명세는 함수 인수의 성격에 따라 정해지고 다른 함수에 함수를 인수로 넘기는 방법은 세 가지가 있다.

 

  • 함수 포인터를 사용한다. 즉,함수 이름을 인수값으로 사용한다. 하지만 밑의 두가지 방법이 더욱 더 좋다
  • 함수 객체를 인수로 전달
  • 람다 표현식을 인수로 전달

함수 객체(종종 펑터(함수연산자)라고 부른다고한다)는 함수 호출 연산자 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