Указание концепции для типа, который имеет шаблон функции-члена, используя Concepts Lite
Я пытаюсь указать концепцию, чтобы ограничить тип с более высоким родом, который имеет шаблон функции-члена, используя Concepts Lite. Однако я не могу найти внутритехническая спецификация илируководство пункт, касающийся шаблонных утверждений внутри концепции.
Как это сделать?
Пример: предположим, у меня более высокий типHKT
с шаблоном функции-членаF
:
template<class T>
struct HKT {
template<class U> // this looks like e.g. rebind in std::allocators
auto F(U) -> HKT<U>;
};
и что теперь я хочу указать концепцию для ограничения этих типов с более высоким родом:
template <template <class> class HKT, class T>
concept HKTWithTemplateMemberFunctionF {
return requires(HKT<T> h) { // HKT<T> is a type, h is an object
// HKT<T> needs to have a member function template that
// returns HTK<U> where the type U is to be deduced and
// it can be any type (it is unconstrained)
template<class U> // is there a syntax for this?
h.F(std::declval<U>()) -> HKT<U>;
}
}
Обратите внимание, что я мог бы сделать что-то вроде:
template <template <class> class HKT, class T, class U>
concept HKTWithTemplateMemberFunctionF {
return requires(HKT<T> h) {
h.F(std::declval<U>()) -> HKT<U>;
}
}
но это значит что мне нужно знатьU
на сайте ограничения.
Мне действительно все равно, если замена для данногоU
не удается или нет, хотя я понимаю, почему это может быть проблемой: например, примените ограничение, чтобы убедиться, что ваша функция не завершается с ошибкой, а затем завершается сбоем, потому что ограничение было выполнено, но во время создания экземпляра произошла ошибка в шаблоне функции-члена (поможет ли это, если шаблон функции-члена был ограничен?).