如何在 c++20 约束算法中投影 std::tuple

康桓瑋*_*康桓瑋 9 c++ range-v3 c++20

假设我们有一个 s 数组std::pair

using Particle = std::pair<std::string, double>;
Particle particles[] {{"Electron", 0.511}, {"Muon", 105.66}, {"Tau", 1776.86}};
Run Code Online (Sandbox Code Playgroud)

我们可以使用具有不同投影函数的C++20范围算法来根据不同的数据成员对它们进行排序:

ranges::sort(particles, {}, &Particle::first);
ranges::sort(particles, {}, &Particle::second);
Run Code Online (Sandbox Code Playgroud)

这看起来非常干净。但是当我将Particle的数据类型移至std::tuple

using Particle = std::tuple<std::string, double>;
Run Code Online (Sandbox Code Playgroud)

我不能再使用相同的投影度量,因为std::tuple没有firstsecond没有成员。或者,只需传递 lambda 即可正常工作:

ranges::sort(particles, {}, [](const auto& t) { return std::get<0>(t); });
ranges::sort(particles, {}, [](const auto& t) { return std::get<1>(t); });
 
Run Code Online (Sandbox Code Playgroud)

但是有没有更简洁的项目方法可以做到这一点?

ranges::sort(particles, {}, &std::get<0>); 
Run Code Online (Sandbox Code Playgroud)

Pas*_* By 4

您可以提供自己的函子来执行此操作

namespace my
{
    template<size_t n>
    struct get_t
    {
        template<typename T>
        decltype(auto) operator()(T&& t) const
        {
            using std::get;
            return get<n>(std::forward<T>(t));
        }
    };

    template<size_t n>
    inline constexpr get_t<n> get;
}

ranges::sort(particles, {}, my::get<0>);
Run Code Online (Sandbox Code Playgroud)