Чтобы добиться этого, я использую общий шаблон статической функции-члена template static void write(output_stream_t&stream, T const& object), который сериализует произвольные объекты, при этом не удаляются только определенные специализации и перегрузки шаблона. Например, у меня есть общая специализация для диапазонов размеров в форме
Код: Выделить всё
template
requires requires(output_stream_t& stream, ranges::range_value_t value) {
{ write(stream, value) };
}
static void write(output_stream_t& stream, T const& range);
Проблема здесь в том, что способ ограничения, анализируемые языком, не соответствуют намерениям, которые я имел при их написании. Тип, подобный вектор, не пытается использовать специализацию для диапазонов размеров, поскольку его тип значения — вектор, экземпляр специализации которого еще не создан время, когда предложение require оценивается. Разумеется, сам тип вектор использует правильную перегрузку, если он используется где-либо, кроме этого конкретного предложения require. Предполагаемое поведение при вызове write(output_stream_t&, вектор const&) заключается в том, чтобы средство проверки типов учитывало специализацию для диапазонов размеров и искало способ вызова write(output_stream_t&, вектор const& ), что заставляет его снова учитывать специализацию для диапазонов размеров и искать способ вызова write(output_stream_t&, int const&), который он находит в форме интегральной специализации, что приводит к выводу, что вектор можно использовать в качестве второго аргумента для записи.
Мой главный вопрос: есть ли способ заставить программу проверки ограничений C++ выполнять этот «рекурсивный» учет перегрузок, или мне придется прибегать к проверкам ограничений во время выполнения в телах функций write? Мой второстепенный вопрос: есть ли в работе комитета и рабочих групп какие-либо предложения по решению этого вопроса?
Я уже видел этот вопрос, который недалеко упирается в та же проблема, что и у меня, но в данном случае она не предлагает никаких решений.
Подробнее здесь: https://stackoverflow.com/questions/793 ... aints-in-c
Мобильная версия