置换参数包中的参数

时间:2016-05-17 23:15:18

标签: c++ c++11 template-meta-programming

我有两个结构

template <int ... values>
struct foo {}

template <int ... values>
struct lists {} 

我希望有一个函数bar,其listsfoo以及foo的permutes参数返回另一个foo

another_foo bar(lists<0,3,1,2>, foo<4,5,6,7>)

我希望another_foo的类型为foo<4,7,5,6>,因此基本上按照另一个参数对一个参数进行排序。我还希望函数能够使用列表中的任意参数,而不必作为foo参数的索引,例如

another_foo bar(lists<20,12,21,13>, foo<4,5,6,7>)

我希望another_foo成为foo<6,4,7,5>的类型别名。在这种情况下,lists<20,12,21,13>基本上是lists<2,0,3,1>的另一个版本,就因为ascendency而言是元素的排列方式。我怎么能这样做?

由于

1 个答案:

答案 0 :(得分:2)

template<size_t N>
constexpr size_t count_less(const int (&seq)[N], int i, size_t cur = 0) {
    return cur == N ? 0
                    : (count_less(seq, i, cur + 1) + (seq[cur] < i ? 1 : 0));
}

template<class List, class Foo, class Seq>
struct meow;

template<int... ls, int... fs, size_t... ss>
struct meow<lists<ls...>, foo<fs...>, std::index_sequence<ss...>>{
    constexpr static int lst[] = { ls... };
    constexpr static int fvals[] = {fs...};
    using type = foo<fvals[count_less(lst, lst[ss])]...>;
};

template<int... ls, int... fs>
auto bar(lists<ls...>, foo<fs...>)
    -> typename meow<lists<ls...>, foo<fs...>, 
                     std::make_index_sequence<sizeof...(ls)>>::type;