VCCC  2024.05
VisualCamp Common C++ library
template_arity.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 1/12/24.
3 //
4 
5 #ifndef VCCC_TYPE_TRAITS_TEMPLATE_ARITY_HPP
6 #define VCCC_TYPE_TRAITS_TEMPLATE_ARITY_HPP
7 
8 #include <cstddef>
9 #include <type_traits>
10 
13 
14 namespace vccc {
15 namespace detail {
16 
17 template<template<typename...> class C, typename TS, typename = void>
18 struct can_put_template : std::false_type {};
19 
20 template<template<typename...> class C, typename... Args>
21 struct can_put_template<C, type_sequence<Args...>, void_t<C<Args...>>> : std::true_type {};
22 
23 template<template<typename...> class C, std::size_t N, bool = can_put_template<C, make_type_sequence<int, N>>::value>
24 struct default_template_arity_impl;
25 
26 template<template<typename...> class C, std::size_t N>
27 struct default_template_arity_impl<C, N, true> : std::integral_constant<std::size_t, N> {};
28 
29 template<template<typename...> class C, std::size_t N>
30 struct default_template_arity_impl<C, N, false> : default_template_arity_impl<C, N + 1> {};
31 
32 template<
33  template<typename...> class C,
34  std::size_t Size,
35  bool = can_put_template<C, make_type_sequence<int, Size>>::value>
36 struct template_arity_impl;
37 
38 template<template<typename...> class C, std::size_t Size>
39 struct template_arity_impl<C, Size, true> : std::integral_constant<std::size_t, Size> {};
40 
41 template<template<typename...> class C, std::size_t Size>
42 struct template_arity_impl<C, Size, false> : template_arity_impl<C, Size - 1> {};
43 
44 template<template<typename...> class C>
45 struct template_arity_impl<C, 0, false> : std::integral_constant<std::size_t, static_cast<std::size_t>(-1)> {};
46 
47 } // namespace detail
48 
51 
52 
53 
55 template<template<typename...> class C, std::size_t MaxSize = 6>
56 struct template_arity : detail::template_arity_impl<C, MaxSize>{};
57 
58 
60 template<template<typename...> class C>
61 struct mandatory_template_arity : detail::default_template_arity_impl<C, 0> {};
62 
63 
65 template<template<typename...> class C, std::size_t MaxSize = 6>
67  : std::integral_constant<std::size_t, template_arity<C, MaxSize>::value - mandatory_template_arity<C>::value> {};
68 
70 
71 } // namespace vccc
72 
73 #endif // VCCC_TYPE_TRAITS_TEMPLATE_ARITY_HPP
void void_t
Definition: void_t.hpp:19
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
get default template parameter count of template class
Definition: template_arity.hpp:67
get mandatory template parameter count of template class
Definition: template_arity.hpp:61
get template parameter count of template class
Definition: template_arity.hpp:56