@@ -194,31 +194,32 @@ namespace strtpl {
194194 throw std::runtime_error (std::move (msg));
195195 }
196196
197- template <class CharT >
198- struct string_template {
199- using char_type = CharT;
200-
201- std::basic_string_view<CharT> delimiter{};
202- std::basic_string_view<CharT> idpattern{};
203- std::basic_string_view<CharT> braceidpattern{};
204- const std::basic_string_view<CharT> invalid{TYPED_LITERAL (CharT, " ()" )};
197+ template <class CharT , class ST = std::char_traits<CharT>>
198+ struct basic_string_template {
199+ private:
200+ std::basic_string_view<CharT, ST> delimiter{};
201+ std::basic_string_view<CharT, ST> idpattern{};
202+ std::basic_string_view<CharT, ST> braceidpattern{};
203+ const std::basic_string_view<CharT, ST> invalid{TYPED_LITERAL (CharT, " ()" )};
205204 std::regex_constants::match_flag_type flags = std::regex_constants::match_default;
206205
207- string_template () = default ;
206+ public:
207+ basic_string_template () = default ;
208208 // clang-format off
209- constexpr string_template (std::basic_string_view<CharT> delim,
210- std::basic_string_view<CharT> id)
209+ constexpr basic_string_template (std::basic_string_view<CharT, ST > delim,
210+ std::basic_string_view<CharT, ST > id)
211211 : delimiter{delim}, idpattern{id}, braceidpattern{id} {}
212- constexpr string_template (std::basic_string_view<CharT> delim,
213- std::basic_string_view<CharT> id,
214- std::basic_string_view<CharT> bid,
215- std::regex_constants::match_flag_type f = std::regex_constants::match_default)
212+ constexpr basic_string_template (std::basic_string_view<CharT, ST > delim,
213+ std::basic_string_view<CharT, ST > id,
214+ std::basic_string_view<CharT, ST > bid,
215+ std::regex_constants::match_flag_type f = std::regex_constants::match_default)
216216 : delimiter{delim}, idpattern{id}, braceidpattern{bid}, flags{f} {}
217217 // clang-format on
218218
219219 // clang-format off
220- template <class ST , class Map >
221- requires map_with_key_type<Map, std::basic_string_view<CharT, ST>>
220+ template <class Map >
221+ requires map_with_key_type<Map, std::basic_string_view<CharT, ST>> and std::convertible_to<
222+ map_mapped_t <Map, std::basic_string_view<CharT, ST>>, std::basic_string_view<CharT, ST>>
222223 std::basic_string<CharT, ST>
223224 // clang-format on
224225 operator ()(std::basic_string_view<CharT, ST> s, const Map& map) const {
@@ -231,20 +232,19 @@ namespace strtpl {
231232 + invalid + TYPED_LITERAL (CharT, " )" );
232233 }()};
233234
234- const auto convert =
235- [&delim = delimiter, first = s.begin (),
236- &map](const std::match_results<typename std::basic_string_view<CharT, ST>::iterator>& mo)
237- -> std::remove_cvref_t <map_mapped_t <Map, std::basic_string_view<CharT, ST>>> {
235+ using string_view_type = std::basic_string_view<CharT, ST>;
236+ const auto convert = [&delim = delimiter, first = s.begin (), &map](
237+ const std::match_results<typename string_view_type::iterator>& mo) {
238238 if (mo[1 ].matched ) {
239- std::basic_string_view<CharT, ST> key (std::to_address (mo[1 ].first ),
240- static_cast <std::size_t >(mo[1 ].length ()));
241- return at (map, key);
239+ string_view_type key (std::to_address (mo[1 ].first ),
240+ static_cast <std::size_t >(mo[1 ].length ()));
241+ return string_view_type ( at (map, key) );
242242 } else if (mo[2 ].matched ) {
243- std::basic_string_view<CharT, ST> key (std::to_address (mo[2 ].first ),
244- static_cast <std::size_t >(mo[2 ].length ()));
245- return at (map, key);
243+ string_view_type key (std::to_address (mo[2 ].first ),
244+ static_cast <std::size_t >(mo[2 ].length ()));
245+ return string_view_type ( at (map, key) );
246246 } else if (mo[3 ].matched ) {
247- return delim;
247+ return string_view_type ( delim. data (), delim. length ()) ;
248248 } else if (mo[4 ].matched ) {
249249 _invalid (first, mo.prefix ().second );
250250 }
@@ -253,12 +253,15 @@ namespace strtpl {
253253
254254 return regex_replace_fn (s, re, convert, flags);
255255 }
256- }; // struct string_template
256+ }; // struct basic_string_template
257+
258+ using string_template = basic_string_template<char >;
259+ using wstring_template = basic_string_template<wchar_t >;
257260
258261 inline namespace cpo {
259262 // See https://github.com/python/cpython/blob/971343eb569a3418aa9a0bad9b638cccf1470ef8/Lib/string.py#L57
260- inline constexpr string_template< char > substitute{" $" , " ([_a-zA-Z][_a-zA-Z0-9]*)" };
261- inline constexpr string_template< wchar_t > wsubstitute{L" $" , L" ([_a-zA-Z][_a-zA-Z0-9]*)" };
263+ inline constexpr string_template substitute{" $" , " ([_a-zA-Z][_a-zA-Z0-9]*)" };
264+ inline constexpr wstring_template wsubstitute{L" $" , L" ([_a-zA-Z][_a-zA-Z0-9]*)" };
262265 } // namespace cpo
263266
264267#undef TYPED_LITERAL
0 commit comments