【一人 C++20 Advent Calendar 2019】std::result_of が削除される【20日目】

一人 C++20 Advent Calendar 2019 20日目の記事になります。

std::result_of が削除される

C++11 で追加され、C++17 で非推奨になっていた std::result_of が削除されます。
変わりに今後は std::invoke_result を使用する事が推奨されます。

#include <type_traits>

struct plus{
    template<typename T>
    auto
    operator ()(T a, T b) {
        return a + b;
    }
};

int
main(){
    // C++20 ではエラー
    static_assert(std::is_same_v<std::result_of<plus(int, int)>::type, int>);
    static_assert(std::is_same_v<std::result_of<plus(float, float)>::type, float>);

    // C++20 では std::invoke_result を使用する
    static_assert(std::is_same_v<std::invoke_result<plus, int, int>::type, int>);
    static_assert(std::is_same_v<std::invoke_result<plus, float, float>::type, float>);

    return 0;
}

result_ofboost を使っていた時代からお世話になっていたので削除されるのは感慨深いものがありますねえ。 std::invoke_result といった今時のメタ関数は全然把握していたので C++20 とかで遊ぶ場合はどのメタ関数を使えばいいのかわからなくて苦労しそう。

参照