Я пытаюсь указать концепцию для ограничения более высокого типа, который имеет шаблон функции-члена с помощью 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
терпит неудачу или нет, хотя я могу понять, почему это может быть проблемой: например. примените ограничение, чтобы убедиться, что ваша функция не сбой, а затем сбой приводит к тому, что ограничение было выполнено, но при замещении времени создания экземпляра в шаблоне функции-члена (помогло бы, если бы шаблон функции-члена был ограничен?).