42 lines
1.2 KiB
C++
42 lines
1.2 KiB
C++
#pragma once
|
|
// tuple utils
|
|
|
|
#include <tuple>
|
|
|
|
namespace meta
|
|
{
|
|
template<typename Tuple, template<typename ...> typename Wrap>
|
|
struct tuple_wrap;
|
|
|
|
template<typename Tuple, template<typename ...> typename Wrap>
|
|
using tuple_wrap_t = typename tuple_wrap<Tuple, Wrap>::type;
|
|
|
|
|
|
template<typename...Ts>
|
|
using tuple_cat_t = decltype(std::tuple_cat(std::declval<Ts>()...));
|
|
|
|
template<typename T1, typename T2>
|
|
struct tuple_join;
|
|
|
|
template<typename T1, typename T2>
|
|
using tuple_join_t = typename tuple_join<T1, T2>::type;
|
|
|
|
template <typename T, typename Tuple, std::size_t Index = 0>
|
|
consteval std::size_t index_in_tuple() {
|
|
if constexpr (Index == std::tuple_size_v<Tuple>) {
|
|
return Index; // 如果没有找到,返回元组的大小作为标志
|
|
}
|
|
else if constexpr (std::is_same_v<T, std::tuple_element_t<Index, Tuple>>) {
|
|
return Index; // 找到匹配的类型,返回当前索引
|
|
}
|
|
else {
|
|
return index_in_tuple<T, Tuple, Index + 1>(); // 递归检查下一个索引
|
|
}
|
|
}
|
|
|
|
template<typename FindMe, typename Tuple>
|
|
constexpr uint8_t index_in_tuple_v = index_in_tuple<FindMe, Tuple>();
|
|
|
|
template<typename T, typename ... Args>
|
|
constexpr auto tuple_construct(const std::tuple<Args...>&) noexcept;
|
|
} |