- ベストアンサー
C++/Cこういうことは可能でしょうか?違う型の引数をとって同じようなことをする
お世話になります。 C++の初心者です。 違う引数をとって同じ関数にいれて同じようなことをさせるというのは できるのでしょうか? コンストラクタの作成方法で可能?? 共用体で可能?? 例: 型の違う構造体A,Bがある。 構造体のメンバには同じstatusが存在する。 statusが1のときだけresultを+し値を返す。 typedef struct{ int status; int b; } DATA_A; typedef struct{ int status; int b; int c; } DATA_B; int test(DATA_AかDATA_Bを引数でとる,int data_num){ //data_numはデータ数 int i=0; int counter=0; for(i=0;i<data_num;i++){ //DATA_AまたはDATA_Bのメンバstatusが1ならcounterを+する if(DATA_A.status == 1){ counter++; } } return counter; } 以上のような感じです。 引数の型が違う2つの関数を作ればできますが、 同じことをさせるので同じ関数で実現できないかなと思って 質問させてもらいました。 よろしくおねがいします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
テンプレートを使うとか #include <iostream> typedef struct{ int status; int b; } DATA_A; typedef struct{ int status; int b; int c; } DATA_B; template <class T> int test(T data,int data_num){ int counter=0; for(int i=0;i<data_num;i++){ if(data.status == 1){ counter++; } } return counter; } int main(){ DATA_A a={ 1, 2 }; DATA_B b={ 0, 3 }; int result; result = test<DATA_A>(a, 5); std::cout << result << std::endl; result = test<DATA_B>(b, 5); std::cout << result << std::endl; return 0; }
その他の回答 (1)
- KoHal
- ベストアンサー率60% (110/181)
派生させたらそれですむんじゃないでしょうか? struct DATA_A { int status; int b; }; struct DATA_B : public DATA_A { int c; }; int test( DATA_A& data, int data_num ) { //... } それとも派生が使えない理由があるのでしょうか?
補足
御回答ありがとうございます。 C++は初心者なのでそういう手があるのを知らなかっただけです。(--;) しかしながらDATA_A,DATA_Bは既に定義されてしまっていて そちらへの変更はできないのですが、それだと厳しいですか?
お礼
御回答どうもありがとうございます。 やりたかったことができました(^^)