C++ - 맴버 함수 포인터와 배열을 사용하여 멤버 함수를 번호로 지정하여 호출 하는 방법
#include <iostream>
#include <memory>
using ub4 = unsigned int;
// 외부에 공개해서 이용하는 클래스
class A {
public: // 클래스 밖에서 using을 사용하고 싶으므로 public 로 한다.
class impl;
private:
std::unique_ptr<impl> pim;
public:
A();
~A();
public:
void func_call( ub4 fn_num );
};
// 멤버 함수 포인터로 타입을 선언
using a_fn_ptr_t = void ( A::impl:: * )();
class A::impl {
static constexpr ub4 pf_num = 4; // 정수로 배열 요소 수를 지정
static a_fn_ptr_t func_ar[ pf_num ];
public:
impl();
~impl();
public:
void func_call( ub4 fn_num );
private:
void func_00();
void func_01();
void func_02();
void func_03();
};
// 배열에 멤버 함수 포인터를 넣는다
a_fn_ptr_t A::impl::func_ar[] = {
&A::impl::func_00,
&A::impl::func_01,
&A::impl::func_02,
&A::impl::func_03
};
A::A() :
pim ( new impl() )
{}
A::~A()
{}
void A::func_call( ub4 fn_num )
{
pim->func_call( fn_num );
}
A::impl::impl() { printf("A::impl::impl() \n");}
A::impl::~impl() { printf("A::impl::~impl()\n");}
void A::impl::func_call( ub4 fn_num )
{
if( fn_num >= pf_num ) return;
( this->*( func_ar[ fn_num ] ) )(); // 배열에 들어가 있는 멤버 함수를 호출한다.
}
void A::impl::func_00() { printf("A::impl::func_00()\n"); }
void A::impl::func_01() { printf("A::impl::func_01()\n"); }
void A::impl::func_02() { printf("A::impl::func_02()\n"); }
void A::impl::func_03() { printf("A::impl::func_03()\n"); }
int main()
{
A a;
a.func_call( 0 );
a.func_call( 1 );
a.func_call( 2 );
a.func_call( 3 );
a.func_call( 4 );
a.func_call( 5 );
a.func_call( 6 );
return 0;
}
이 글은 2020-07-16에 작성되었습니다.