如何在 C++20 约束算法中投射 std::tuple
How to project std::tuple in c++20 constrained algorithms
假设我们有一个数组 std::pair
s:
using Particle = std::pair<std::string, double>;
Particle particles[] {{"Electron", 0.511}, {"Muon", 105.66}, {"Tau", 1776.86}};
我们可以使用具有不同投影函数的C++20范围算法来根据不同的数据成员对它们进行排序:
ranges::sort(particles, {}, &Particle::first);
ranges::sort(particles, {}, &Particle::second);
这看起来很干净。但是当我将 Particle
的数据类型移动到 std::tuple
:
using Particle = std::tuple<std::string, double>;
我不能再使用相同的投影指标,因为 std::tuple
没有 first
或 second
成员。或者,只需传递 lambda 即可正常工作:
ranges::sort(particles, {}, [](const auto& t) { return std::get<0>(t); });
ranges::sort(particles, {}, [](const auto& t) { return std::get<1>(t); });
但是有没有更简洁的项目方法来做到这一点?
ranges::sort(particles, {}, &std::get<0>);
您可以提供自己的仿函数来执行此操作
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>);
假设我们有一个数组 std::pair
s:
using Particle = std::pair<std::string, double>;
Particle particles[] {{"Electron", 0.511}, {"Muon", 105.66}, {"Tau", 1776.86}};
我们可以使用具有不同投影函数的C++20范围算法来根据不同的数据成员对它们进行排序:
ranges::sort(particles, {}, &Particle::first);
ranges::sort(particles, {}, &Particle::second);
这看起来很干净。但是当我将 Particle
的数据类型移动到 std::tuple
:
using Particle = std::tuple<std::string, double>;
我不能再使用相同的投影指标,因为 std::tuple
没有 first
或 second
成员。或者,只需传递 lambda 即可正常工作:
ranges::sort(particles, {}, [](const auto& t) { return std::get<0>(t); });
ranges::sort(particles, {}, [](const auto& t) { return std::get<1>(t); });
但是有没有更简洁的项目方法来做到这一点?
ranges::sort(particles, {}, &std::get<0>);
您可以提供自己的仿函数来执行此操作
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>);