Когда вы работаете с шаблонами и с decltype
, вам часто требуется экземпляр определенного типа, даже если у вас его нет.В этом случае std::declval<T>()
невероятно полезен.Это создает воображаемый экземпляр типа T
.
Есть ли что-то похожее для понятий?то есть функция, которая создала бы и воображаемый тип для концепции.
Позвольте мне привести вам пример (немного надуманный, но должен служить цели):
Давайте определим концепцию Incrementable
template <typename T>
concept Incrementable = requires(T t){
{ ++t } -> T;
};
Теперь я хотел бы иметь концепцию, которая проверяет, есть ли у объекта оператор operator()
, который может принять Incrementable
.В моем воображаемом синтаксисе я написал бы что-то вроде этого:
template <typename F, typename T = declval<Incrementable>>
concept OperatesOnIncrementable = requires(F f, T t){
{ f(t) } -> T;
}
Там declval
в typename T = declval<Incrementable>
создаст воображаемый тип T
, который на самом деле не является конкретным типом, но для всех целей и задачведет себя как тип, который удовлетворяет Incrementable
.
Есть ли механизм в следующем стандарте, чтобы учесть это?Я нашел бы это невероятно полезным.
Редактировать: Некоторое время назад я задал аналогичный вопрос , можно ли это сделать с boost::hana
.
Редактировать: Почему это полезно?Например, если вы хотите написать функцию, которая составляет две функции
template <typename F, typename G>
auto compose(F f, G g) {
return [f, g](Incrementable auto x) { return f(g(x)); };
}
Я хочу получить ошибку, когда пытаюсь составить две функции, которые не могут быть скомпонованы.Не ограничивая типы F
и G
, я получаю ошибку только при попытке вызвать составную функцию.