私は私の質問説明するために、次の例を与える:あなたは上記のコードから見ることができるようにクラスメンバ関数への関数ポインタを使用してC++関数を単純化するにはどうすればよいですか?
class Abc
{
public:
int height();
int width();
int area();
};
typedef std::vector<class Abc> AbcArray;
void obtain_selected_list_based_on_area(AbcArray& objArray,
std::vector<int> &listIndexArray)
{
std::vector<int> areaArray;
for(int i=0; i<objArray.size(); i++)
areaArray.push_back(objArray[i].area());
function_select_list(areaArray,listIndexArray);
}
void obtain_selected_list_based_on_height(AbcArray& objArray,
std::vector<int> &listIndexArray)
{
std::vector<int> areaArray;
for(int i=0; i<objArray.size(); i++)
areaArray.push_back(objArray[i].height());
function_select_list(areaArray,listIndexArray);
}
void obtain_selected_list_based_on_width(AbcArray& objArray,
std::vector<int> &listIndexArray)
{
std::vector<int> areaArray;
for(int i=0; i<objArray.size(); i++)
areaArray.push_back(objArray[i].width());
function_select_list(areaArray,listIndexArray);
}
は、我々は、3つの異なる基準に基づいてリストを選択することを決定しました。そのためには、obtain_selected_list_based_on_area
、obtain_selected_list_based_on_height
、およびobtain_selected_list_based_on_width
の3つの関数を記述する必要があります。
私はそれをどのように単純化することができますか?
私のために1つの解決策。
void obtain_select_list(AbcArray& objArray, std::vector<int> &listSel, FUN fun)
{
std::vector<int> areaArray;
for(int i=0; i<objArray.size(); i++)
areaArray.push_back(objArray[i].width());
function_select_list(areaArray,listIndexArray);
}
しかし、私は関数ポインタは、クラスのメンバーを指しているので、それを動作させることはできません。一つは、関数ポインタを使用することです。
動作させる方法についていくつか考えていますか?さらに、この問題の他の解決策はありますか?
関数ポインタを渡す代わりに、適切なメソッドを持つクラスのインスタンスへの参照を渡し、 'obtain_select_list()'メソッドをインスタンスに対して呼び出すようにすることができますその仕事をしなさい。 –
...また、関数をコンパイル時(テンプレート)パラメータとして渡します。既知の関数を呼び出す方が速いです:fnptrは仮想呼び出しほど遅いです! – lorro
トピック以外:IMHO、あなたは 'unsigned int'を' height'、 'width'、' area'に使うべきです。 'int'型は負の数を許します。私はまだ負の高さ、幅、または領域を見ていません。 –