Информация об изменениях

Сообщение Re: Ресолвинг неоднозначностей концептов от 25.11.2022 10:49

Изменено 25.11.2022 10:51 rg45

Re: Ресолвинг неоднозначностей концептов
Здравствуйте, vdimas, Вы писали:

V>Привет, коллеги.


V>Сугубо из любопытства вопрос, есть ли возможность разресолвить неоднозначность в концептах тут:

V>
  пример
V>
V>#include <concepts>

V>template<typename T>
V>concept has_foo = 
V>    requires(const T& a) {
V>        a.foo();
V>    };

V>template<typename T>
V>concept has_boo = 
V>    requires(const T& a) {
V>        a.boo();
V>    };

V>template<has_foo T>
V>void func(const T& a) {
V>    a.foo();
V>}

V>template<has_boo T>
V>void func(const T& a) {
V>    a.boo();
V>}

V>struct A {
V>    void foo() const {}
V>};

V>struct B {
V>    void boo() const {}
V>};

V>struct C {
V>    void foo() const {}
V>    void boo() const {}
V>};

V>void test() {
V>    A a;
V>    B b;
V>    C c;

V>    func(a);
V>    func(b);
V>    func(c);  // неоднозначность
V>}
V>



Ну, самое просто, наверное, это добавить дополнительный констрейнт в объявлении одной из или обеих функций foo и boo:

http://coliru.stacked-crooked.com/a/2032ee3df28d3077

template<has_boo T>
requires(!has_foo<T>)
void func(const T& a) 
{
    a.boo();
}
Re: Ресолвинг неоднозначностей концептов
Здравствуйте, vdimas, Вы писали:

V>Привет, коллеги.


V>Сугубо из любопытства вопрос, есть ли возможность разресолвить неоднозначность в концептах тут:

V>
  пример
V>
V>#include <concepts>

V>template<typename T>
V>concept has_foo = 
V>    requires(const T& a) {
V>        a.foo();
V>    };

V>template<typename T>
V>concept has_boo = 
V>    requires(const T& a) {
V>        a.boo();
V>    };

V>template<has_foo T>
V>void func(const T& a) {
V>    a.foo();
V>}

V>template<has_boo T>
V>void func(const T& a) {
V>    a.boo();
V>}

V>struct A {
V>    void foo() const {}
V>};

V>struct B {
V>    void boo() const {}
V>};

V>struct C {
V>    void foo() const {}
V>    void boo() const {}
V>};

V>void test() {
V>    A a;
V>    B b;
V>    C c;

V>    func(a);
V>    func(b);
V>    func(c);  // неоднозначность
V>}
V>



Ну, самое просто, наверное, это добавить дополнительный констрейнт в объявлении одной из или обеих функций foo и boo:

http://coliru.stacked-crooked.com/a/2032ee3df28d3077

template<has_boo T>
requires(!has_foo<T>)
void func(const T& a) 
{
    a.boo();
}


Ну или на базе существующего создать новый концепт (концепты), расширенные и уточненные.