Skip to content

Instantly share code, notes, and snippets.

@lykkin
Created July 21, 2016 02:43
Show Gist options
  • Save lykkin/f3bf5503767c4589175da53c0a78c8b7 to your computer and use it in GitHub Desktop.
Save lykkin/f3bf5503767c4589175da53c0a78c8b7 to your computer and use it in GitHub Desktop.
#include <iostream>
using namespace std;
template<typename T, T... values>
struct value_tuple {
static const size_t size = sizeof...(values);
typedef T value_type;
};
template<int i, typename ValueTuple>
struct value_get;
template<typename T, T front, T... values>
struct value_get<0, value_tuple<T, front, values...> > {
typedef T value_type;
static const T value = front;
};
template<int i, typename T, T front, T... values>
struct value_get<i, value_tuple<T, front, values...> > : public value_get<i - 1, value_tuple<T, values...> > {};
template <int index, typename input, typename filtered>
struct actual_filter;
template <int x, int... filtered>
struct actual_filter<x, value_tuple<int>, value_tuple<int, filtered...> > {
typedef value_tuple<int, filtered...> Value;
};
template<int x, int front, int... input, int... filtered>
struct actual_filter<x, value_tuple<int, front, input...>, value_tuple<int, filtered...> > : public conditional<front < x, actual_filter<x, value_tuple<int, input...>, value_tuple<int, front, filtered...> >, actual_filter<x, value_tuple<int, input...>, value_tuple<int, filtered...> > >::type{};
template <int x, int... input>
struct filter_less {
typedef typename actual_filter<x, value_tuple<int, input...>, value_tuple<int> >::Value Value;
};
template <size_t index, size_t end, typename values>
struct printer;
template <size_t index, size_t end, typename T, T... values>
struct printer<index, end, value_tuple<T, values...> > {
static void doStuff() {
cout << value_get<index, value_tuple<T, values>... >::value << endl;
printer<index + 1, end, value_tuple<T, values...> >::doStuff();
}
};
template <size_t index, typename T, T... values>
struct printer<index, index, value_tuple<T, values...> > {
static void doStuff() {}
};
int main(int, char *[])
{
typedef filter_less<30, 6, 5, 4, 67, 7, 3, 4, 5, 4>::Value Filtered;
printer<0, Filtered::size, Filtered>::doStuff();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment