Info
-
Did you know that C+23 permitts static constexpr variables in constexpr functions?
Example
constexpr auto foo() {
static constexpr auto value = 42; // error in C++20, okay in C++23
return value;
}
Puzzle
Can you implement
to_string_view
which converts in-place given characters to string_view?
template<char... Cs>
[[nodiscard]] constexpr auto to_string_view(); // TODO
static_assert(std::string_view{""} == to_string_view<>());
static_assert(std::string_view{"42"} == to_string_view<'4', '2'>());
static_assert(std::string_view{"foo"} == to_string_view<'f', 'o', 'o'>());
static_assert(std::string_view{"bar"} == to_string_view<'b', 'a', 'r'>());
Solutions
template<char... Cs>
[[nodiscard]] constexpr auto to_string_view(){
static constexpr char p[sizeof...(Cs)] = {Cs...};
return std::string_view(p, sizeof...(Cs));
}
template<char... Cs>
[[nodiscard]] constexpr auto to_string_view(){
static constexpr std::array<char, sizeof...(Cs)> chars{Cs...};
return std::string_view{chars};
}
template<>
[[nodiscard]] constexpr auto to_string_view<>(){
return std::string_view{};
}
[[nodiscard]] constexpr auto to_string_view()
{
constexpr static std::size_t N = sizeof...(Cs);
if constexpr (N >0)
{
constexpr static std::array<char,N> chars{Cs...};
return std::string_view(chars.data(),N);
} else
return std::string_view("");
}
template<char... Cs>
[[nodiscard]] constexpr auto to_string_view() {
static constexpr char cs[]{Cs..., 0};
return std::string_view{cs};
}