• ベストアンサー

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つの関数を作ればできますが、 同じことをさせるので同じ関数で実現できないかなと思って 質問させてもらいました。 よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.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; }

mugi-cha
質問者

お礼

御回答どうもありがとうございます。 やりたかったことができました(^^)

その他の回答 (1)

  • KoHal
  • ベストアンサー率60% (110/181)
回答No.1

派生させたらそれですむんじゃないでしょうか? struct DATA_A {  int status;  int b; }; struct DATA_B : public DATA_A {  int c; }; int test( DATA_A& data, int data_num ) { //... } それとも派生が使えない理由があるのでしょうか?

mugi-cha
質問者

補足

御回答ありがとうございます。 C++は初心者なのでそういう手があるのを知らなかっただけです。(--;) しかしながらDATA_A,DATA_Bは既に定義されてしまっていて そちらへの変更はできないのですが、それだと厳しいですか?