@@ -13,35 +13,33 @@ template <auto Value>
13
13
constexpr static auto as_constant_v =
14
14
std::integral_constant<std::remove_cvref_t <decltype (Value)>, Value>{};
15
15
16
- template <auto ... Args> struct args {
17
- constexpr static auto value = stdx::make_tuple(as_constant_v<Args>...);
18
- } ;
16
+ template <auto ... Args> struct args {};
17
+
18
+ template < typename ...> struct config ;
19
19
20
- template <typename ConfigArgs, typename ... ConfigTs>
21
- struct config : public detail ::config_item {
20
+ template <auto ... ConfigArgs, typename ... ConfigTs>
21
+ struct config <args<ConfigArgs...>, ConfigTs...> : public detail::config_item {
22
22
stdx::tuple<ConfigTs...> configs_tuple;
23
23
24
- CONSTEVAL explicit config (ConfigArgs, ConfigTs const &...configs)
24
+ CONSTEVAL explicit config (args< ConfigArgs...> , ConfigTs const &...configs)
25
25
: configs_tuple{configs...} {}
26
26
27
27
template <typename ... Args>
28
28
[[nodiscard]] constexpr auto extends_tuple (Args const &...args) const {
29
- return ConfigArgs::value.apply ([&](auto const &...config_args ) {
30
- return configs_tuple.apply ([&](auto const &...configs_pack ) {
31
- return stdx::tuple_cat (
32
- configs_pack.extends_tuple (args..., config_args...)...);
33
- });
29
+ return configs_tuple.apply ([&](auto const &...configs_pack ) {
30
+ return stdx::tuple_cat (configs_pack.extends_tuple (
31
+ args..., as_constant_v<ConfigArgs>...)...);
34
32
});
35
33
}
36
34
37
35
template <typename ... Args>
38
36
[[nodiscard]] constexpr auto exports_tuple (Args const &...args) const {
39
- return ConfigArgs::value.apply ([&](auto const &...config_args ) {
40
- return configs_tuple.apply ([&](auto const &...configs_pack ) {
41
- return stdx::tuple_cat (
42
- configs_pack.exports_tuple (args..., config_args...)...);
43
- });
37
+ return configs_tuple.apply ([&](auto const &...configs_pack ) {
38
+ return stdx::tuple_cat (configs_pack.exports_tuple (
39
+ args..., as_constant_v<ConfigArgs>...)...);
44
40
});
45
41
}
46
42
};
43
+
44
+ template <typename ... Ts> config (Ts...) -> config<Ts...>;
47
45
} // namespace cib::detail
0 commit comments