Здравствуйте, Went, Вы писали:
W>Наверное, я ошибаюсь, но все-таки спрошу. А нет ли опасности, что перегрузки этой функции — форматтера, объявленные после определения функции std::format, окажутся вне области её видимости и не будут вызываться? Или есть способ как-то просто обойти эту проблему?
Сейчас также все не сахар. Форматер в виде специализации класса не вызывается и всё, пока ты правильно не подберёшь синтаксис перегрузки. С шаблонными классами это бывает не очень просто. Вот пример у меня в коде:
namespace htlib::v2
{
template<typename type_t>
struct is_point {
static std::false_type test(...);
template<htlib::v2::uint_t dimensions, typename other_t>
static std::true_type test(const htlib::v2::pointxd_t<dimensions, other_t>&);
static constexpr bool value = decltype(test(std::declval<type_t>()))::value;
};
template<typename type_t>
inline constexpr bool is_point_v = is_point<type_t>::value;
} // namespace htlib::v2
template<typename char_t, typename point_t>
class std::formatter<point_t, char_t, std::enable_if_t<htlib::v2::is_point_v<point_t>>>
{
//...
}
Вот такие мета-функции приходится писать что бы написать форматер для всех наследников базового шаблонного класса.
Хотя в случае с функциями была простая перегрузка, типа:
template<htlib::v2::uint_t dimensions, typename other_t>
void formatter(const htlib::v2::pointxd_t<dimensions, other_t>&);