Created
April 21, 2025 08:41
-
-
Save banister/2a006a2a50e25b40f25daed5beaab7db to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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