Сообщение Re[2]: Ресолвинг неоднозначностей концептов от 25.11.2022 15:07
Изменено 25.11.2022 15:10 vdimas
Re[2]: Ресолвинг неоднозначностей концептов
Здравствуйте, rg45, Вы писали:
R>Ну, самое просто, наверное, это добавить дополнительный констрейнт в объявлении одной из или обеих функций foo и boo:
R>Ну или на базе существующего создать новый концепт (концепты), расширенные и уточненные.
Было любопытно уметь выбирать вариант ф-ии в месте использования, а не в месте объявления, т.к. такие ф-ии могут быть несвязанными, не знать друг о друге и тд.
Например, есть возможность выбрать желаемую сигнатуру ф-ии из набора перегрузок, указав приведение к сигнатуре.
Или можно явно указать параметры шаблонной ф-ии.
Чтобы можно было использовать где-то так:
Выше приведение к неполному типу, понятно, но в случае выбора ф-ии из мн-ва перегруженных их, компилятор де-факто не приводит значение адреса, а выбирает ф-ию:
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>Ну или на базе существующего создать новый концепт (концепты), расширенные и уточненные.
Было любопытно уметь выбирать вариант ф-ии в месте использования, а не в месте объявления, т.к. такие ф-ии могут быть несвязанными, не знать друг о друге и тд.
Например, есть возможность выбрать желаемую сигнатуру ф-ии из набора перегрузок, указав приведение к сигнатуре.
Или можно явно указать параметры шаблонной ф-ии.
Чтобы можно было использовать где-то так:
Выше приведение к неполному типу, понятно, но в случае выбора ф-ии из мн-ва перегруженных их, компилятор де-факто не приводит значение адреса к требуемому типу, а выбирает ф-ию:
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);