2

我目前在 C++ 中使用此代码来调用函数指针,如果它不为空(我有一些事件,如 onCreate、onDestroy 等,它们是可以分配的函数指针):

#define AssertiveCall(_fn, _args) \
    { \
        if (_fn != nullptr) \
        { \
            return (_fn##_args); \
        } \
    }

我想把它转换成一个模板,这样我仍然可以获得速记的好处,但没有#define macro. 我怎么能做到?

4

1 回答 1

7

作为参考,使用可变参数模板的实现 - 以防其他人遇到类似问题并且可以使用可变参数模板:

template <typename Return, typename ...Parameters, typename ...Args>
auto AssertiveCall(Return (*function)(Parameters...), Args&& ...args)
    -> Return
{
    if (function != nullptr) {
        return (*function)(std::forward<Args>(args)...);
    } else {
        return Return{};
    }
}
于 2012-11-01T08:30:13.570 回答