The following code compiles and runs fine with libfmt8. https://godbolt.org/z/bGGPM1Mrs
#include <array>
#include <fmt/core.h>
template <std::size_t N>
class fixed_string {
public:
static_assert(N > 0);
constexpr fixed_string() : m_size(0) {};
constexpr fixed_string(const char* str) {
m_size = std::min(strlen(str), N - 1);
std::copy(str, str + m_size, &m_data[0]);
m_data[m_size] = 0;
}
constexpr auto begin() const noexcept { return &m_data[0]; }
constexpr auto cbegin() const noexcept { return &m_data[0]; };
constexpr auto end() const noexcept { return &m_data[m_size]; }
constexpr auto cend() const noexcept { return &m_data[m_size]; };
constexpr const char& operator[](std::size_t pos) const { return m_data[pos]; }
constexpr const char* data() const noexcept { return &m_data[0]; }
constexpr std::size_t size() const noexcept { return m_size; }
private:
std::size_t m_size;
std::array<char, N> m_data;
};
template <std::size_t N>
class fmt::formatter<fixed_string<N>> : fmt::formatter<std::string_view> {};
int main() {
fixed_string<40> str = "hello";
fmt::print(">>>{:^10}<<<", str);
}
but starting with libfmt9 it seems this no longer works. https://godbolt.org/z/h41frMo6a