Как выразить ограничение через другую концепциюC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как выразить ограничение через другую концепцию

Сообщение Anonymous »

Наверное, проще всего конкретно описать, что я пытаюсь решить, чтобы это было легче понять.
У меня есть концепция SmartPointer, поэтому я могу иметь функции который может принимать либо std::unique_ptr, либо std::shared_ptr:

Код: Выделить всё

template 
concept SmartPointer = requires(const T& t) {
requires std::same_as;
};
Я хочу создать функцию, которая может принимать пару итераторов, где тип значения итератора должен иметь тип SmartPointer, и мне не нужно явно определять какие-либо типы .
Я могу создать функцию, которая имеет параметр шаблона с ограничением SmartPointer, и проверить это:

Код: Выделить всё

template 
requires std::same_as
void doWithSmartPointers(TIterator begin, TIteratorSentinel end) {
for (auto it = begin; it != end; ++it) {
// Some logic with it->get() etc.
}
}
Однако при его использовании мне необходимо явно указывать T, чего я бы предпочел не делать:

Код: Выделить всё

std::vector v{};
v.push_back(std::make_unique(1));
v.push_back(std::make_unique(2));
v.push_back(std::make_unique(3));
doWithSmartPointer(v.begin(), v.end()); // Error, couldn't infer template argument T
doWithSmartPoint(v.begin(), v.end()); // OK
Из сообщения об ошибке я предполагаю, что мне нужно какое-то руководство по выводу шаблонов, но, насколько я понимаю, они могут быть определены только для классов/структур, а не для функций.
p>
По сути, мне нужно что-то вроде этого:

Код: Выделить всё

template 
requires std::same_as // Not valid syntax!
void doWithSmartPointers(TIterator begin, TIteratorSentinel end) {
for (auto it = begin; it != end; ++it) {
// Some logic with it->get() etc.
}
}
Правильно ли я это делаю? Возможно ли это вообще? Заранее спасибо!


Подробнее здесь: https://stackoverflow.com/questions/699 ... er-concept
Ответить

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

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

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

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

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