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

Сообщение Re[2]: Ресолвинг неоднозначностей концептов от 25.11.2022 15:07

Изменено 25.11.2022 15:10 vdimas

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

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

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

Было любопытно уметь выбирать вариант ф-ии в месте использования, а не в месте объявления, т.к. такие ф-ии могут быть несвязанными, не знать друг о друге и тд.

Например, есть возможность выбрать желаемую сигнатуру ф-ии из набора перегрузок, указав приведение к сигнатуре.
Или можно явно указать параметры шаблонной ф-ии.

Чтобы можно было использовать где-то так:
void func(const has_foo auto & a) { 
    a.foo(); 
}

void func(const has_boo auto & a) { 
    a.boo(); 
}

...

func<has_foo auto>(c); // или просто func<has_foo>(c)
// или
((void(*)(has_foo auto &))func)(c);


Выше приведение к неполному типу, понятно, но в случае выбора ф-ии из мн-ва перегруженных их, компилятор де-факто не приводит значение адреса, а выбирает ф-ию:
void f(int) {
    std::cout << "int" << std::endl;
}

void f(long) {
    std::cout << "long" << std::endl;
}

...

char c {};

f(c);
((void(*)(long))f)(c);
Re[2]: Ресолвинг неоднозначностей концептов
Здравствуйте, rg45, Вы писали:

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

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

Было любопытно уметь выбирать вариант ф-ии в месте использования, а не в месте объявления, т.к. такие ф-ии могут быть несвязанными, не знать друг о друге и тд.

Например, есть возможность выбрать желаемую сигнатуру ф-ии из набора перегрузок, указав приведение к сигнатуре.
Или можно явно указать параметры шаблонной ф-ии.

Чтобы можно было использовать где-то так:
void func(const has_foo auto & a) { 
    a.foo(); 
}

void func(const has_boo auto & a) { 
    a.boo(); 
}

...

func<has_foo auto>(c); // или просто func<has_foo>(c)
// или
((void(*)(has_foo auto &))func)(c);


Выше приведение к неполному типу, понятно, но в случае выбора ф-ии из мн-ва перегруженных их, компилятор де-факто не приводит значение адреса к требуемому типу, а выбирает ф-ию:
void f(int) {
    std::cout << "int" << std::endl;
}

void f(long) {
    std::cout << "long" << std::endl;
}

...

char c {};

f(c);
((void(*)(long))f)(c);