- 締切済み
C++の関数ポインタについて
例えば汎用的に整列操作を行えるクラスを作ろうと考えます。 で、以下のようなクラスをでっちあげました。 #include <stdlib.h> #include <stdio.h> #include <vector> using namespace std; template< class T >class Sort{ private: inline void swap( vector< T > data , int i , int j ){ T t = data[ i ]; data[ i ] = data[ j ]; data[ j ] = t; } public: vector< T > Data; Sort( vector< T > data ){ Data = data; } void selection( vector< T > data , int ( *func )( vector< T > data , int i , int j ) ) { int min , N = data.size(); {for( int i = 1; i < N; i++ ){ min = i; for( int j = i + 1; j <= N; j++ ){ if( func( data , min , j ) ){ min = j; } } swap( data , min , i ); }} } static int comp( vector< T > data , int i , int j ){ return data[ i ] >= data[ j ]; } }; void main( void ){ Sort< int > *d; vector< int > data( 20 ); d = new Sort< int >( data ); d->selection( data , d->comp ); return; } 中身は整列ソートだけでとても寂しいですが、教科書的に比較部分を汎用的に関数をユーザーが選んで指定できるようになっています。今回はmainからSortクラスでstaticで宣言したcompを指定していますが、staticにしたくないです。でもなっちゃっているのはstaticを外すとコンパイルエラーになるからです。 staticを外したメンバ関数を指定すると例えばこんなエラーがでます。 エラー E2034 template.cpp 43: 'int (* (_closure )(vector<int,allocator<int> >,int,int))(vector<int,allocator<int> >,int,int)' 型は 'int (*)(vector<int,allocator<int> >,int,int)' 型に変換できない(関数 main() ) エラー E2342 template.cpp 43: パラメータ 'func' は int (*)(vector<int,allocator<int> >,int,int) 型として定義されているので void は渡せない(関数 main() ) なんでこのようなエラーになるのか分かりません。メンバ関数を指定したいのですが、指定の仕方が分かりません。どなたか教えてください。本当に困ってしまっています。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
その比較関数は, どのように呼び出すつもりですか? しかし, なんというかどのくらい「汎用性」を考えてつくったコードなんだろう, これ.... 直交性を考えるなら比較関数はクラス Sort のメンバーとしないのが普通だし....
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 >>void selection( vector< T > data , int ( *func )( vector< T > data , int i , int j ) ) これだと、静的な関数ポインタしか受け付けません。 void selection( vector< T > data , int ( Sort<T>::*func )( vector< T > data , int i , int j ) ) { int min , N = data.size(); { for( int i = 1; i < N; i++ ){ min = i; for( int j = i + 1; j <= N; j++ ) { if((this->*func)( data , min , j ) ) { min = j; } } swap( data , min , i ); } } } ではないでしょうか?