C && C++/STL

[C++] Functor / 함수자

힘법사 2021. 10. 7. 16:32
728x90

Functor

Functor는 우리나라말로 함수자라 불립니다. Functor는 객체지만 함수처럼 동작하고 ()연산자에 의해서 정의됩니다.

() 연산자를 정의하는 내용은 제 이전 글에 정리되어있습니다.

[C++] 연산자 오버로딩 (tistory.com)

 

[C++] 연산자 오버로딩

 안녕하세요, 힘법사입니다. 제가 4학년이 되면서 요즘 글을 쓸 시간이 없었네요...  이제 제가 전자공학으로 졸업을 앞두고 있습니다. 이제 자기소개서도 쓰고 하다보니, 제가 많이 했다고 생

himbopsa.tistory.com

 

 Functor의 장점은 어찌되었든 이는 함수가 아닌 객체이기 때문에 연산자()를 제외한 다른 멤버 함수와 멤버 변수들을 가질 수 있습니다.

 

예제

예제로 행렬 곱을 해주는 Functor를 구현해보도록 하겠습니다.

//Matrix Multiply Functor
//return M by N Matrix A  x  N by K Matrix B
//Example :
//A = {1,1,1,1}, B = {1,1,1,1}, M = 2, N = 2, K = 2
//return {2,2,2,2}
struct MatMultiply {
	template<typename T>
	int* operator()(const T* A, const T* B, int M, int N, int K) const {
		T* Result = new int[M * K];
		int cnt = 0;
		for (int m = 0; m < M; m++) { // Read m_th rows A 
			for (int k = 0; k < K; k++) {// Read k_th cols B
				T tmp = 0;
				for (int n = 0; n < N; n++) { // Read n_th cols A / Read n_th row of B
					tmp += *(A + N * m + n) * *(B + K * n + k);
				}
				*(Result + cnt) = tmp;
				cnt++;

			}

		}
		return Result;
	}
};

 해당 코드를 이용하면 두 행렬 사이의 곱을 반환할 수 있는 Functor를 이용할 수 있습니다.

 

테스트

main에서 코드를 작성해 해당 Functor가 잘 동작하는지 확인해보겠습니다.

int main() {
	MatMultiply mat_mul;
	PrintMat mat_print;
	int* A;
	int* B;
	A = new int[4];
	B = new int[4];
	for (int i = 0; i < 4; i++) {
		A[i] = i + 1;
		B[i] = 4 - i;
	}
	int* ans = mat_mul(A, B, 2, 2, 2);
	mat_print(ans,2,2);
	return 0;
}

코드는 해당 코드와 같고, 행렬곱이 올바르게 이루어졌는지 확인하기 위한 PrintMat Functor를 이용해주었습니다.

전체 소스코드는 아래주소에서 확인하실 수 있습니다.

Functor_Practice/main.cpp at master · 2017103030/Functor_Practice (github.com)

 

GitHub - 2017103030/Functor_Practice

Contribute to 2017103030/Functor_Practice development by creating an account on GitHub.

github.com

 

결과를 보면 다음과 같습니다.

그림. 결과

테스트를 위해서

A = |1 2|    B= |4 3|

      |3 4|         |2 1|

A 와 B 행렬을 곱해주었습니다.

결과는 정확하게 나오네요

 

728x90

'C && C++ > STL' 카테고리의 다른 글

[C++] 연산자 오버로딩  (0) 2021.10.02