멤버 함수 포인터와 배열을 사용하여 멤버 함수를 번호로 지정하고 호출하는 방법

11863 단어 C++C++11
비망록입니다만, 모처럼 기사로 하기 때문에 체재를 정돈해 기술하고 싶습니다.

소개(사례)



공개 클래스의 함수에, 번호를 지정하는 것으로 거동을 바꾸고 싶습니다만, 어떻게 쓰면 좋을까요?

코드



#include <iostream>
#include <memory>

// 実務クラスのプライベートメンバー関数を番号で指定して呼び出したい。
// 参考書の通りに書くと、プライベート非staticメンバー関数・・・

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;
}


결과




Start

A::impl::impl() 
A::impl::func_00()
A::impl::func_01()
A::impl::func_02()
A::impl::func_03()
A::impl::~impl()

0

Finish


참조



Wandbox에서 확인하였습니다.
h tp : // 메 l 폰. 오 rg/완 d보 x/페 rm ㎃ k/b 쿠 7 푸 16 우에 tcmJ9

C++11 참고서: 함수 호출(Function call)
ht tp // // 에조에료. 기주 b. 이오/cp-보오 k/C+++11-Sy 난 x-안 d-후아트레. xtml#에 xpr. 괄호

C++11 참고서: 멤버에 대한 포인터 연산자(Pointer-to-member operators)
ht tp // // 에조에료. 기주 b. 이오/cp-보오 k/C+++11-Sy 난 x-안 d-후아트레. xtml#에 xpr. mptr. 오페

C++11 참고서: 비static 멤버 함수(Nonstatic member functions)
ht tp // // 에조에료. 기주 b. 이오/cp-보오 k/C+++11-Sy 난 x-안 d-후아트레. xtml#cぁs. mfct. Non-s c

기타



코드의 색칠이 없으면 전혀 모릅니다.
그건 그렇고, 내 환경windows7 64bitMicrosoft Visual Studio Express 2013 for Windows Desktop그럼, 다음과 같이 표시시키고 있습니다.



색이 빨갛게 될 만큼 어쩐지 위험한 느낌, 조심하지 않으면 안되는 느낌이 나오도록 하고 있습니다만, 이것은 그중 다른 기사에 쓸까라고 생각합니다.

나중에非staticメンバー関数 라고 하는 기술의 방법은 처음과 똑같네요.
일반인의 나에게 있어서는 普通のメンバー関数 라고 기술하고 싶은 곳입니다.

이상입니다.

뭔가 지적 사항이 있으면, 부담없이 코멘트 부탁드립니다.

좋은 웹페이지 즐겨찾기