• ベストアンサー

C言語:引数の型だけ異なる関数を一つにまとめる方法

以下の引数の型だけ異なる関数を、どうにかして一つにまとめたいのですが、 何か良い方法はないでしょうか? void funcA(_MNGR_TAG mngr){ 処理X; } void funcB(_COPY_MNGR_TAG mngr){ 処理X; } 補足: ・_NODE_TAGと_COPY_NODE_TAGは構造体です。ただし中身は異なります。 ・(引数名が同じため)funcAとfuncBで行っている処理は全く同じです。 注意事項: 関数テーブルやC++言語を使用する方法は除いて下さい

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

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

まあ、_MNGR_TAG と _COPY_MNGR_TAG の両方ともいじっていいなら struct _MNGR { (_MNGR_TAG と _COPY_MNGR_TAG の共通要素) union { _MNGR_TAG_ONLY mngr_tag; /*_MNGR_TAG 固有の要素*/ _COPY_MNGR_TAG_ONLY copy_mngr_tag; /*_COPY_MNGR_TAG 固有の要素*/ } depends; }; とするとか、共通部分を構造体 MNGR_COMMON に切り出して struct _MNGR_TAG { struct MNGR_COMMON common; (以下、_MNGR_TAG 固有の要素) }; struct _COPY_MNGR_TAG { struct MNGR_COMMON common; (以下、_COPY_MNGR_TAG 固有の要素) }; とした後 MNGR_COMMON を引数にして処理Xを行う関数を作るとかありますが、 でもこれ、オブジェクト指向が理解できていないといつか破綻すると思いますよ。 さもないと共通処理Y(Xとは異なる引数を要する)が出てきたときに困りますから。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

字面は同じでも、構造体の構造が異なると、コンパイル結果は異なったコードになるので、共用は不可能です。 No1の方のお書きのように、マクロで出来るだけ字面を共用するくらいですね。 あるいは、各構造体から処理Xに必要な項目を取りだして、 void funcA(_MNGR_TAG mngr){ X(必要な項目を引数に並べる); } void funcB(_COPY_MNGR_TAG mngr){ X(必要な項目を引数に並べる); } void X(必要な項目を引数に並べる){ 実際の処理内容; }

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

処理Xの内容を #define X(mngr) { \  … \  } のように書くのが簡単だと思います。