我已经开始使用这种类型的构造,它依赖于 C++20 的 lambda 显式模板参数:
template<typename... Ts>
struct Foo
{
std::tuple<Ts...> bars;
auto get_labels(const std::array<std::size_t,sizeof...(Ts)>& indices) const
{
// construct tuple from bar labels
return [&]<std::size_t... Is>(std::index_sequence<Is...>) {
return std::make_tuple(std::get<Is>(bars).get_label(indices[Is])...);
}(std::index_sequence_for<Ts...>{});
}
};
在 C++17 或 C++14 中是否有相对优雅的方法来做到这一点?或者我现在应该将 C++20 作为一项要求吗?
一个简单的方法是使 lambda 成为成员函数:
template<typename... Ts>
struct Foo
{
std::tuple<Ts...> bars;
template <std::size_t... Is>
auto get_labels_(
const std::array<std::size_t, sizeof...(Ts)>& indices,
std::index_sequence<Is...>
) const
{
return std::make_tuple(std::get<Is>(bars).get_label(indices[Is])...);
}
auto get_labels(const std::array<std::size_t,sizeof...(Ts)>& indices) const
{
// construct tuple from bar labels
return get_labels_(indices, std::index_sequence_for<Ts...>{});
}
};
但不确定它是否算得上相对优雅。