@@ -28,49 +28,56 @@ namespace ns::process
2828{
2929namespace dimension_implementation
3030{
31+ template <template <std::size_t > typename Dimension, typename F, std::size_t ... N>
32+ using ReturnType = std::common_type_t <decltype (std::declval<F>()(Dimension<N>()))...>;
33+
3134[[noreturn]] void dimension_not_supported_error (unsigned dimension);
3235
33- template <template <std::size_t > typename Dimension, typename T, std::size_t ... N>
34- auto apply (const std::size_t dimension, const T& f, std::index_sequence<N...>&&)
36+ template <template <std::size_t > typename Dimension, typename F, std::size_t ... N>
37+ requires (std::is_same_v<void , ReturnType<Dimension, F, N...>>)
38+ void apply (const std::size_t dimension, const F& f, std::index_sequence<N...>&&)
3539{
36- using ReturnType = std::common_type_t <decltype (f (Dimension<N>()))...>;
40+ const bool r = ((
41+ [&]
42+ {
43+ if (N == dimension)
44+ {
45+ f (Dimension<N>());
46+ return true ;
47+ }
48+ return false ;
49+ }()
50+ || ...));
3751
38- if constexpr (std::is_same_v< void , ReturnType> )
52+ if (r )
3953 {
40- const bool r = ((
41- [&]
42- {
43- if (N == dimension)
44- {
45- f (Dimension<N>());
46- return true ;
47- }
48- return false ;
49- }()
50- || ...));
51- if (r)
52- {
53- return ;
54- }
54+ return ;
5555 }
56- else
57- {
58- std::optional<ReturnType> r;
59- static_cast <void >((
60- [&]
61- {
62- if (N == dimension)
63- {
64- r.emplace (f (Dimension<N>()));
65- return true ;
66- }
67- return false ;
68- }()
69- || ...));
70- if (r)
56+
57+ dimension_not_supported_error (dimension);
58+ }
59+
60+ template <template <std::size_t > typename Dimension, typename F, std::size_t ... N>
61+ requires (!std::is_same_v<void , ReturnType<Dimension, F, N...>>)
62+ auto apply (const std::size_t dimension, const F& f, std::index_sequence<N...>&&)
63+ {
64+ std::optional<ReturnType<Dimension, F, N...>> r;
65+
66+ static_cast <void >((
67+ [&]
7168 {
72- return std::move (*r);
73- }
69+ if (N == dimension)
70+ {
71+ r.emplace (f (Dimension<N>()));
72+ return true ;
73+ }
74+ return false ;
75+ }()
76+ || ...));
77+
78+ if (r)
79+ {
80+ return std::move (*r);
7481 }
7582
7683 dimension_not_supported_error (dimension);
0 commit comments