Skip to content

Commit dc91158

Browse files
author
Hana Dusíková
committed
Support named captures in C++17 mode (issue #96)
1 parent ee7834a commit dc91158

File tree

3 files changed

+96
-92
lines changed

3 files changed

+96
-92
lines changed

include/ctre/return_type.hpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ template <typename Head, typename... Tail> struct captures<Head, Tail...>: captu
114114
}
115115
#if __cpp_nontype_template_parameter_class
116116
template <ctll::fixed_string Name> CTRE_FORCE_INLINE static constexpr bool exists() noexcept {
117+
#else
118+
template <const auto & Name> CTRE_FORCE_INLINE static constexpr bool exists() noexcept {
119+
#endif
117120
if constexpr (std::is_same_v<typename Head::name, void>) {
118121
return captures<Tail...>::template exists<Name>();
119122
} else {
@@ -124,7 +127,6 @@ template <typename Head, typename... Tail> struct captures<Head, Tail...>: captu
124127
}
125128
}
126129
}
127-
#endif
128130
template <size_t id> CTRE_FORCE_INLINE constexpr auto & select() noexcept {
129131
if constexpr (id == Head::get_id()) {
130132
return head;
@@ -155,6 +157,9 @@ template <typename Head, typename... Tail> struct captures<Head, Tail...>: captu
155157
}
156158
#if __cpp_nontype_template_parameter_class
157159
template <ctll::fixed_string Name> CTRE_FORCE_INLINE constexpr auto & select() const noexcept {
160+
#else
161+
template <const auto & Name> CTRE_FORCE_INLINE constexpr auto & select() const noexcept {
162+
#endif
158163
if constexpr (std::is_same_v<typename Head::name, void>) {
159164
return captures<Tail...>::template select<Name>();
160165
} else {
@@ -165,7 +170,6 @@ template <typename Head, typename... Tail> struct captures<Head, Tail...>: captu
165170
}
166171
}
167172
}
168-
#endif
169173
};
170174

171175
template <> struct captures<> {
@@ -178,9 +182,11 @@ template <> struct captures<> {
178182
}
179183
#if __cpp_nontype_template_parameter_class
180184
template <ctll::fixed_string> CTRE_FORCE_INLINE static constexpr bool exists() noexcept {
185+
#else
186+
template <const auto &> CTRE_FORCE_INLINE static constexpr bool exists() noexcept {
187+
#endif
181188
return false;
182189
}
183-
#endif
184190
template <size_t> CTRE_FORCE_INLINE constexpr auto & select() const noexcept {
185191
return capture_not_exists;
186192
}
@@ -189,9 +195,11 @@ template <> struct captures<> {
189195
}
190196
#if __cpp_nontype_template_parameter_class
191197
template <ctll::fixed_string> CTRE_FORCE_INLINE constexpr auto & select() const noexcept {
198+
#else
199+
template <const auto &> CTRE_FORCE_INLINE constexpr auto & select() const noexcept {
200+
#endif
192201
return capture_not_exists;
193202
}
194-
#endif
195203
};
196204

197205
template <typename Iterator, typename... Captures> class regex_results {
@@ -213,6 +221,8 @@ template <typename Iterator, typename... Captures> class regex_results {
213221
}
214222
#if __cpp_nontype_template_parameter_class
215223
template <ctll::fixed_string Name, typename = std::enable_if_t<decltype(_captures)::template exists<Name>()>> CTRE_FORCE_INLINE constexpr auto get() const noexcept {
224+
#else
225+
template <const auto & Name, typename = std::enable_if_t<decltype(_captures)::template exists<Name>()>> CTRE_FORCE_INLINE constexpr auto get() const noexcept {
216226
return _captures.template select<Name>();
217227
}
218228
#endif

0 commit comments

Comments
 (0)