私は次のように非常に単純なクラス定義を持っています:
#include "../bshttp/controllers.h"
#include <iostream>
#include <string>
class DerivedController : public BS_Controllers
{
public:
DerivedController():BS_Controllers(this)
{
m_urlRules["print"] = REG_NAME &DerivedController::print;
//regController(REG_NAME &DerivedController::print,"print");
regController(REG_NAME &DerivedController::printView,"printView");
}
void * print()
{
return NULL;
}
void * printView()
{
cout<<"Print view!"<<endl;
return NULL;
}
};
ここでどちらか
m_urlRules["print"] = REG_NAME &DerivedController::print;
また
regController(REG_NAME &DerivedController::printView,"printView");
すべてのメンバー関数に対して呼び出す必要があります。クラスのメンバー関数ポインタを取り、文字列でマップするので、後で関数を文字列で識別できます。
すべてが正常に機能していますが、クラス構造が大きくなると、プログラマーはすべてのメンバー関数に対してこの関数を繰り返し呼び出す必要があります。とにかくプリプロセッサ、またはブーストウェーブなどの前処理ライブラリを使用して、プログラマーがこれらの繰り返しの呼び出しを行う必要がないようにすることはできますか?
編集:混乱して申し訳ありませんが、私は明らかにここで問題を十分に説明していませんでした。文字列をメンバー関数ポインタにマッピングしています。
m_urlRulesは文字列をキーとするstd::mapであり、メンバー関数ポインターを値としてregControllerは基本的にm_urlRulesのセッター関数であるため、両方のステートメントは事実上同じことを行い、文字列をメンバー関数にマップします。
REG_NAMEは、非常に醜い型キャストを置き換えるマクロです。
私がやろうとしているのは、クラスが次の構造を持つ場合、
class DerivedController : public BS_Controllers
{
public:
DerivedController():BS_Controllers(this);
void * print();
void * print2();
void * print3();
void * print4();
};
コンストラクターで次のことを行う必要はありません。
m_urlRules["print"] = REG_NAME &DerivedController::print;
m_urlRules["print1"] = REG_NAME &DerivedController::print1;
m_urlRules["print2"] = REG_NAME &DerivedController::print2;
m_urlRules["print3"] = REG_NAME &DerivedController::print3;
m_urlRules["print4"] = REG_NAME &DerivedController::print4;