まず、質問の名前がわからなかったので、それで十分だと思います。
基本的に、型だけが異なる共通の機能を持つ関数がたくさんあります。テンプレートのようですね。しかし、ここに問題があります。各関数は十分に具体的であるため、各関数に異なる名前を付けたいと思います。
たとえば、次のコードを見てください。
bool GetFriendsList(FriendsListRequestData::CallbackType Callback)
{
check(Callback != nullptr);
FriendsListRequest* Request = new FriendsListRequest(this, GetNewRequestID());
FriendsListRequestData* Data = new FriendsListRequestData(Request, Callback);
return StoreAndPerformRequest(Data);
}
bool GetAccountInfo(AccountInfoRequestData::CallbackType Callback)
{
check(Callback != nullptr);
AccountInfoRequest* Request = new AccountInfoRequest(this, GetNewRequestID());
AccountInfoRequestData* Data = new AccountInfoRequestData(Request, Callback);
return StoreAndPerformRequest(Data);
}
// Many more routines...
2 つの機能はほぼ同じです。型と関数名のみが異なります。関数をテンプレート化することはできますが、それらは同じ名前になります。マクロを使用して以下を実装しましたが、コードが読みにくくなるのが好きではありません。
#define IMPLEMENT_REQUEST_FUNCTION(Name, RequestType, RequestDataType) \
bool Name(RequestDataType::CallbackType Callback) \
{ \
check(Callback != nullptr); \
RequestType* Request = new RequestType(this, GetNewRequestID()); \
RequestDataType* Data = new RequestDataType(Request, Callback); \
return StoreAndPerformRequest(Data); \
}
class Foo
{
public:
// other stuff...
IMPLEMENT_REQUEST_FUNCTION(GetFriendsList, FriendsListRequest, FriendsListRequestData)
IMPLEMENT_REQUEST_FUNCTION(GetAccountInfo, AccountInfoRequest, AccountInfoRequestData)
// other stuff...
};
クラスとソースの両方に関数を何度も追加するよりもマクロの方が好きですが、結果の関数に異なる名前を付けながらテンプレート化された機能を取得する方法があるので、マクロを使用する必要はありません (またはおそらくよりフレンドリーなマクロ)?
ありがとうございました。
編集:背景情報を入れすぎて、実際に求めていたものを歪めた可能性があります. 本質的に、マクロなしで上記のマクロの機能を何らかの方法で取得できるかどうか疑問に思っています。関数名はすべて本質的に同じ実装を持っていますが、すべて異なる名前にしようとしています。