2

現在、C++ でこのコードを使用して、null でない場合に関数ポインターを呼び出します (割り当て可能な関数ポインターである 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 に答える