gpt4 book ai didi

c++ - 是否可以将 `integral_constant` 的列表转换回 `T` 的列表?

转载 作者:搜寻专家 更新时间:2023-10-31 02:14:18 25 4
gpt4 key购买 nike

我设法转换了一个 template<int ...Args> struct Listintegral_constant 的列表但是,是否可以从 integral_constant 转换为回到int是吗?

以下是我如何从 IntList 进行转换至 List :

template<typename ...Args>
struct List;

template<typename T>
struct ListFromTupleImpl;
template<typename ...Args>
struct ListFromTupleImpl<std::tuple<Args...>>
{ using type = List<Args...>; };

template<typename T>
using ListFromTuple = typename ListFromTupleImpl<T>::type;
template<typename ...Args>
using TupleCat = decltype(std::tuple_cat(std::declval<Args>()...));
template<typename ...Args>
using ListFromTupleCat = ListFromTuple<TupleCat<Args...>>;

template<int ...Args>
struct IntList;

template<typename ...Args>
struct List
{
template<typename T>
struct Concat;
template<typename ...Args0>
struct Concat<List<Args0...>>
{
using type = ListFromTupleCat<std::tuple<Args...>,
std::tuple<Args0...>>;
};
};

template<int ...Args>
struct IntList
{
template<int first, int ...Args0>
struct ListBuilder
{
using type = typename List<std::integral_constant<int, first>>::
template Concat<typename ListBuilder<Args0...>::type>::type;
};
template<int last>
struct ListBuilder<last>
{
using type = List<std::integral_constant<int, last>>;
};
using asList = typename ListBuilder<Args...>::type;
};

最佳答案

你可以通过让编译器匹配模板模式来做你想做的事:

template<typename... Ts>
auto to_int_list_helper(List<Ts...>) {
return IntList<Ts::value...>{};
}

template<typename ListParam>
using AsIntList = decltype(to_int_list_helper(ListParam{}));

和概念证明:

using L = typename IntList<1,2>::asList;

static_assert(is_same<L, List<integral_constant<int, 1>, integral_constant<int, 2>>>::value, "");

using BackToIntList = AsIntList<L>;

static_assert(is_same<IntList<1,2>, BackToIntList>::value, "");

live demo

由于您还询问了串联,因此利用相同的技术非常简单:

template<int... Ts, int... Us>
auto concat_int_lists_helper(IntList<Ts...>, IntList<Us...>) {
return IntList<Ts..., Us...>{};
}

template<typename A, typename B>
using ConcatIntLists = decltype(concat_int_lists_helper(A{}, B{}));

live demo

关于c++ - 是否可以将 `integral_constant` 的列表转换回 `T` 的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40095629/

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