アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下の引数の型だけ異なる関数を、どうにかして一つにまとめたいのですが、
何か良い方法はないでしょうか?

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

A 回答 (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とは異なる引数を要する)が出てきたときに困りますから。
    • good
    • 0

字面は同じでも、構造体の構造が異なると、コンパイル結果は異なったコードになるので、共用は不可能です。



No1の方のお書きのように、マクロで出来るだけ字面を共用するくらいですね。

あるいは、各構造体から処理Xに必要な項目を取りだして、

void funcA(_MNGR_TAG mngr){
X(必要な項目を引数に並べる);
}
void funcB(_COPY_MNGR_TAG mngr){
X(必要な項目を引数に並べる);
}
void X(必要な項目を引数に並べる){
実際の処理内容;
}
    • good
    • 0

処理Xの内容を


#define X(mngr) { \
 … \
 }
のように書くのが簡単だと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!