Есть ли способ иметь «частично рекурсивные» ограничения функций в C++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Есть ли способ иметь «частично рекурсивные» ограничения функций в C++?

Сообщение Anonymous »

Я пишу класс политики TrivialSerializer, который позже будет встроен в функцию на C++. Эта политика должна сериализовать объекты, типы которых могут быть в определенной степени определены другими политиками, и записывать их в поток. Сериализовать необходимо только значение объекта, поскольку расположение и структура объектов определяются заранее.
Чтобы добиться этого, я использую общий шаблон статической функции-члена 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»