是否有可能将`integral_constant`s列表转换回`T`' s?

时间:2016-10-17 21:04:39

标签: c++ metaprogramming

我设法将template<int ...Args> struct List转换为integral_constant的列表,但是,是否可以将integral_constant转换回{{ 1}} S'

以下是我如何从int转换为IntList

List

1 个答案:

答案 0 :(得分:2)

您可以通过让编译器匹配模板模式来执行您想要的操作:

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