[C++] Functor / 함수자
Functor
Functor는 우리나라말로 함수자라 불립니다. Functor는 객체지만 함수처럼 동작하고 ()연산자에 의해서 정의됩니다.
() 연산자를 정의하는 내용은 제 이전 글에 정리되어있습니다.
[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 행렬을 곱해주었습니다.
결과는 정확하게 나오네요