Skip to content

Instantly share code, notes, and snippets.

@banister
Created April 21, 2025 08:41
Show Gist options
  • Save banister/2a006a2a50e25b40f25daed5beaab7db to your computer and use it in GitHub Desktop.
Save banister/2a006a2a50e25b40f25daed5beaab7db to your computer and use it in GitHub Desktop.
#include <iostream>
#include <type_traits>
template <typename...>
struct typelist;
template <uint32_t n, typename Head, typename...Tail>
struct nthElement;
template <uint32_t n, typename Head, typename...Tail>
struct nthElement<n, typelist<Head, Tail...>>
{
static_assert(n <= sizeof...(Tail), "Index out of bounds!");
using Type = typename nthElement<n - 1, typelist<Tail...>>::Type;
};
template <typename Head, typename...Tail>
struct nthElement<0, typelist<Head, Tail...>>
{
using Type = Head;
};
template <uint32_t n, typename List>
using nthElementOf = typename nthElement<n, List>::Type;
template <typename List1, typename List2>
struct appendTypes;
template <typename...Types1, typename...Types2>
struct appendTypes<typelist<Types1...>, typelist<Types2...>>
{
using Type = typelist<Types2..., Types1...>;
};
template <typename NewTypes, typename List>
using appendTypesTo = typename appendTypes<NewTypes, List>::Type;
template <typename List1, typename List2>
struct prependTypes;
template <typename...Types1, typename...Types2>
struct prependTypes<typelist<Types1...>, typelist<Types2...>>
{
using Type = typelist<Types1..., Types2...>;
};
template <typename NewTypes, typename List>
using prependTypesTo = typename prependTypes<NewTypes, List>::Type;
int main(void)
{
using List = typelist<int, bool, double>;
static_assert(std::is_same_v<nthElementOf<0, List>, int>);
static_assert(std::is_same_v<nthElementOf<1, List>, bool>);
static_assert(std::is_same_v<nthElementOf<2, List>, double>);
static_assert(std::is_same_v<prependTypesTo<typelist<double>, typelist<int, bool>>, typelist<double, int, bool>>);
static_assert(std::is_same_v<appendTypesTo<typelist<double>, typelist<int, bool>>, typelist<int, bool, double>>);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment