gpt4 book ai didi

c++ - 结构体数据成员的Decltype,使用结构化绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 07:14:44 25 4
gpt4 key购买 nike

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

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

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

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
}

Complete Example Here

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

关于c++ - 结构体数据成员的Decltype,使用结构化绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57970524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com