reverse_kacejot
@reverse_kacejot
Junior C++ Developer, bachelor of Applied Math

Как создать концепт, в функциях которого есть вывод типа?

Пишу следующий концепт.
template <typename T>
concept bool Condition = requires(T a) {
    { a.match(...) } -> bool;
};

Весьма простой: концепт обязывает иметь метод match. Я хочу, чтобы тип единственного аргумента match выводился сам.
Пример класса, который смог бы удовлетворить такой концепт:
class A {
public:
    template <typename T>
    bool match(T&& t) {
        t == 1;
    }
};


Вопрос: как указать в концепте автоматический вывод типа аргумента? (что должно быть вместо "..."?)
  • Вопрос задан
  • 136 просмотров
Решения вопроса 1
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Концепт должен применяться к вызывающему коду. Я слегка модифицировал ваш пример для общего случая. Сейчас им можно проверять, содержит ли любой класс метод match с определённой сигнатурой:
template <class T, class V>
concept bool HasMethodMatch = requires(T a, V v) {
    { a.match(v) } -> bool;
};

class A {
public:
    template <class T>
    bool match(T t) const {
        return t == 1;
    }
};

template <class V> 
    requires HasMethodMatch<A, V>
void doSmth(const A& a, V v)
{
    a.match(v);
}

int main()
{
    A a;
    doSmth(a, 5);
    doSmth(a, 5.f);
    doSmth(a, 5.d);
}

Для более общего случая, в методе doSmth, класс A можно заменить на ещё один шаблонный параметр. Но, я думаю, что логика теперь более-менее ясна.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы