c++ - 有没有办法获得具有不同函数名称的通用/模板化功能?

标签 c++ templates macros

首先,我不确定如何命名这个问题,所以我希望它足够好。

本质上,我有一大堆函数,它们具有共同的功能,只是类型不同。听起来像模板是吗?但这里有一个问题:每个函数都足够具体,所以我想用不同的方式命名每个函数。

例如,看下面的代码:

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...

这两个功能几乎相同。它们仅在类型和函数名称上有所不同。我可以将函数模板化,但它们将具有相同的名称。我用宏实现了以下内容,但我不喜欢它会使我的代码变得多么不可读:

#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...
};

与在类和源代码中一遍又一遍地添加函数相比,我更喜欢宏,但是有没有办法在以不同方式命名结果函数的同时获得模板化功能所以我不会必须使用宏(或者可能使用更友好的宏)?

谢谢。


编辑:我可能提供了过多的背景信息并歪曲了我实际询问的内容。本质上,我想知道我是否可以在没有宏的情况下以某种方式获得上述宏的功能。我试图让所有函数名称都不同,即使它们都具有基本相同的实现。

最佳答案

关于:

template <typename R, typename D>
bool Get(typename D::CallbackType Callback)
{
    check(Callback != nullptr);
    R* Request = new R(this, GetNewRequestID());
    D* Data = new D(Request, Callback);
    return StoreAndPerformRequest(Data);
}

inline bool GetFriendsList(FriendsListRequestData::CallbackType Callback)
{
    return Get<FriendsListRequest, FriendsListRequestData>(Callback);
}

inline bool GetAccountInfo(AccountInfoRequestData::CallbackType Callback)
{
    return Get<AccountInfoRequest, AccountInfoRequestData>(Callback);
}

请注意,您可能还需要模板化 StoreAndPerformRequest()

关于c++ - 有没有办法获得具有不同函数名称的通用/模板化功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18155235/

相关文章:

C++ 将那些带到零和一数组前面的最佳方法

c++ - 括号和指针节点

python - python中的泛型/模板?

c - 宏 if 语句返回错误 : operator '&&' has no right operand

c++ - 什么是隐藏切片拷贝构造函数?

c++ - C++ 命名空间中的内联函数

c++ - 初始化包含元组数组的类的正确且简单的方法是什么?

c++ - 在 Cython 中包装 C++ 模板函数/方法

检查 int 是否被定义为宏。 C

c - 是否可以在 C 中自动生成的变量名中使用 __LINE__ ?