繁体   English   中英

结构化数据成员的decltype,使用结构化绑定

[英]Decltype of struct data members, using structured binding

我有一个模板,该模板的类型可以在结构上绑定到两个别名(可以是一个元组,也可以是一个结构)。 我需要别名指向的两个变量的类型。

template <typename T>
T obj;
// type of a/b in auto&& [a, b] = obj ?

在实际使用结构化绑定之前,我需要知道类型:

template <typename S>
void fn(ranges::any_view<S> range_of_tuple_or_struct_or_pair) {

    last_from = std::numeric_limits<?????>::max();

    // ????? should be the type of from (or to, they should be the same types) of: 
    //     auto&& [from, to] = <range element>

    for (auto&& [from, to] : range_of_tuple_or_struct_or_pair) {
         if (from != last_from) {
             ...;
             last_from = from;
         }
    }
}

我认为您可以执行以下操作:

#include <type_traits>

template <typename T, typename U>
struct Identity {
  using type_first = T;
  using type_second = U;
};

template <typename T>
constexpr auto GetTypes(const T& obj) noexcept {
  const auto& [x, y] = obj;
  return Identity<std::remove_cv_t<decltype(x)>, 
                  std::remove_cv_t<decltype(y)>>{};
}

template <typename T>
void foo(T obj) {
  // T is structurally-bindable with two fields
  constexpr auto Types = GetTypes(obj);
  using t1 = typename decltype(Types)::type_first;
  using t2 = typename decltype(Types)::type_second;

  // t1 is the first type
  // t2 is the second type
}

在这里完成示例

请注意,即使没有启用优化,使用constexpr也不会产生开销。

可能您可以在last_from声明之前添加一个额外的结构化绑定,并从中from类型。

const auto& [first_from, first_to] = *range_of_tuple_or_struct_or_pair.begin();
last_from = std::numeric_limits<std::decay_t<decltype(first_from)>>::max();

不太酷,但也许可以

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM