81 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#pragma once
 | 
						|
#include <type_traits>
 | 
						|
 | 
						|
namespace meta
 | 
						|
{
 | 
						|
    template<typename T, template<typename ...> typename Template>
 | 
						|
    struct is_template;
 | 
						|
 | 
						|
    template<typename T, template<typename ...> typename Template>
 | 
						|
    constexpr auto is_template_v = is_template<T, Template>::value;
 | 
						|
 | 
						|
 | 
						|
	template<typename Seq1, typename Seq2>
 | 
						|
	struct index_sequence_cat;
 | 
						|
 | 
						|
	template<typename Seq1, typename Seq2>
 | 
						|
	using index_sequence_cat_t = typename index_sequence_cat<Seq1, Seq2>::type;
 | 
						|
 | 
						|
 | 
						|
	template<typename T>
 | 
						|
	struct index_sequence_rev;
 | 
						|
 | 
						|
	template<typename T>
 | 
						|
	using index_sequence_rev_t = typename index_sequence_rev<T>::type;
 | 
						|
 | 
						|
 | 
						|
	template<typename T, typename>
 | 
						|
	struct is_iterable;
 | 
						|
 | 
						|
	template<typename T>
 | 
						|
	constexpr auto is_iterable_v = is_iterable<T>::value;
 | 
						|
 | 
						|
 | 
						|
	template<typename T, typename>
 | 
						|
	struct is_sequential_container;
 | 
						|
 | 
						|
	template<typename T>
 | 
						|
	constexpr auto is_sequential_container_v = is_sequential_container<T>::value;
 | 
						|
 | 
						|
 | 
						|
	template<typename T, typename>
 | 
						|
	struct is_associative_container;
 | 
						|
 | 
						|
	template<typename T>
 | 
						|
	constexpr auto is_associative_container_v = is_associative_container<T>::value;
 | 
						|
 | 
						|
	template<typename T>
 | 
						|
	struct is_container;
 | 
						|
 | 
						|
	template<typename T>
 | 
						|
	constexpr auto is_container_v = is_container<T>::value;
 | 
						|
 | 
						|
	template<typename T, typename>
 | 
						|
	struct is_contiguous_container;
 | 
						|
 | 
						|
	template<typename T>
 | 
						|
	constexpr auto is_contiguous_container_v = is_contiguous_container<T>::value;
 | 
						|
 | 
						|
	template<typename T, typename>
 | 
						|
	struct is_macro_enum;
 | 
						|
 | 
						|
	template<typename T>
 | 
						|
	constexpr auto is_macro_enum_v = is_macro_enum<T>::value;
 | 
						|
 | 
						|
 | 
						|
	template<typename T, typename VariantT>
 | 
						|
	struct is_variant_member;
 | 
						|
 | 
						|
	template<typename T, typename VariantT>
 | 
						|
	constexpr auto is_variant_member_v = is_variant_member<T, VariantT>::value;
 | 
						|
 | 
						|
 | 
						|
    // true if is integral/floating point, or is convertible to string
 | 
						|
    template<typename T>
 | 
						|
    struct is_basic_serializable;
 | 
						|
 | 
						|
    // true if is integral/floating point, or is convertible to string
 | 
						|
    template<typename T>
 | 
						|
    constexpr auto is_basic_serializable_v = is_basic_serializable<T>::value;
 | 
						|
}
 |