diff --git a/CMakeLists.txt b/CMakeLists.txt index da13200..b9f4118 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,7 @@ add_subdirectory( Utility ) # The local subdir tests to build add_subdirectory( AutoRAII.test ) add_subdirectory( Enum.test ) +add_subdirectory( make_template.test ) add_subdirectory( comparisons.test ) add_subdirectory( Exception.test ) add_subdirectory( word_wrap.test ) diff --git a/make_template.h b/make_template.h new file mode 100644 index 0000000..7b6b3e5 --- /dev/null +++ b/make_template.h @@ -0,0 +1,38 @@ +static_assert( __cplusplus > 2023'00 ); + +#pragma once + +#include + +#include + +namespace Alepha::Hydrogen ::detail:: make_template_m +{ + inline namespace exports {} + + template< template< typename ... > class, TypeListType > + struct make_template; + + template< template< typename ... > class Template, typename ... Types > + struct make_template< Template, TypeList< Types... > > + { + using type= Template< Types... >; + }; + + namespace exports + { + /*! + * Bind a type list to a class template which takes a list of arguments. + * + * @tparam Template The class template to instantiate. + * @tparam List The list of types (`Alepha::TypeList< ... >`) to bind. + */ + template< template< typename ... > class Template, TypeListType List > + using make_template_t= typename make_template< Template, List >::type; + }; +} + +namespace Alepha::Hydrogen::inline exports::inline make_template_m +{ + using namespace detail::make_template_m::exports; +} diff --git a/make_template.test/0.cc b/make_template.test/0.cc new file mode 100644 index 0000000..2a06bf7 --- /dev/null +++ b/make_template.test/0.cc @@ -0,0 +1,21 @@ +static_assert( __cplusplus > 2023'00 ); + +#include "../make_template.h" + +#include +#include + +namespace +{ + #define ALL_TYPES int, float, char, double, std::nullptr_t, void + using MyTypes= Alepha::TypeList + < + ALL_TYPES + >; + + using MyTuple= Alepha::make_template_t< std::tuple, MyTypes >; + static_assert( std::is_same_v< MyTuple, std::tuple< ALL_TYPES > > ); + + using MyVariant= Alepha::make_template_t< std::variant, MyTypes >; + static_assert( std::is_same_v< MyVariant, std::variant< ALL_TYPES > > ); +} diff --git a/make_template.test/CMakeLists.txt b/make_template.test/CMakeLists.txt new file mode 100644 index 0000000..b099603 --- /dev/null +++ b/make_template.test/CMakeLists.txt @@ -0,0 +1 @@ +unit_test( 0 )