xso::generator — Custom Formatting
We specialize the std::formatter class to connect any xso::generator, State, or Scrambler class to std::format and friends.
All of our classes have a class method xso_name() that returns a suitable name string.
We define a C++ concept to capture that common feature:
template<typename T>
concept has_xso_name_class_method = requires {
{ T::xso_name() } -> std::convertible_to<std::string>;
};We use that concept to specialize the template [std::formatter] struct appropriately:
template<has_xso_name_class_method T>
struct std::formatter<T> {
...
};We can also define the usual output stream operator:
template<has_xso_name_class_method T>
std::ostream &
operator<<(std::ostream &s, const T& rhs);