| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > специализация ф-ции для function<void()> |
| Автор: borisbn 28.2.2012, 11:32 | ||||
| Здравствуйте. Следующий код
http://liveworkspace.org/code/3b891bff696e9ea5a89efd162fb93933 выдаёт ошибку
Причём, если закомментировать все "void"-функции и раскомментировать "float", то всё работает. Не могу понять, это какой-то глюк или всё так и должно быть ? Как обойти это - я уже нашёл (SFINAE = enable_if + is_void), но хотелось бы понять, в чём здесь дело. Спасибо. |
| Автор: azesmcar 28.2.2012, 11:46 |
Все же void(T) и void(void) это немного разные вещи, void(void) - это тот же void() и компилятор не может найти шаблонную функцию. Почему бы не сделать вот так? http://liveworkspace.org/code/aed04e13fed108f260d5547b7322db45 или можно через перегрузку http://liveworkspace.org/code/0a23eab68ffd54626dce71a6127f0cad |
| Автор: boostcoder 28.2.2012, 12:00 |
| все равно не понимаю, почему не работает вариант borisbn`а... |
| Автор: boostcoder 28.2.2012, 12:15 |
| ааа, въехал! ну да, <void> и <void(void)> это же разные типы) |
| Автор: borisbn 28.2.2012, 12:19 |
| azesmcar, спасибо. Первый вариант мне не подходит, т.к. в первую функцию можно подать функцию, принимающую два аргумента или возвращающую не void, а вот второй - то, что надо. Как-то я не сообразил, что специализация, с одной стороны - это та же перегрузка, но с другой стороны налагает некоторые ограничения. |
| Автор: borisbn 28.2.2012, 14:24 | ||
неа. у меня там не void и void(void), а void( T ) и void(). мдаааа. а вот такая специализация работает:
http://liveworkspace.org/code/296038cd2a53b273b57b051b93d6fb7a хотя, на первый взгляд, это - вещи похожие |
| Автор: azesmcar 28.2.2012, 14:31 |
void() и void(T), это разные вещи. все верно, возвращяемый тип частью сигнатуры функции не является. |
| Автор: borisbn 28.2.2012, 14:57 | ||
не знал... так по этому нельзя перегружать функции, если они отличаются только возвращаемым значением... и всё равно остаётся непонятным - чем принципиально следующий код отличается от первого?
http://liveworkspace.org/code/bc1be32edad9db5581518a7d69366a42 будем считать, что std::vector в данном примере - это std::function в первом... |
| Автор: azesmcar 28.2.2012, 15:05 | ||
| borisbn Вот пример попроще.
компилятор пытается найти функцию foo с таким параметром, но не находит. |
| Автор: boostcoder 28.2.2012, 15:06 | ||||
кстати да, вспомнил про обсуждение на некотором форуме.
|
| Автор: borisbn 28.2.2012, 15:39 | ||
| кажется начинаю понимать: если в параметрах функции указано энное количество аргументов (пусть и шаблонных), то все специализации обязаны поддержать эту сигнатуру, а void - это не такой же тип, как и все остальные, а отсутствие параметра. Вот пример ещё проще
http://liveworkspace.org/code/d632e6c8ba6bd8ba475ff271d1374f59 |
| Автор: azesmcar 28.2.2012, 16:01 | ||
|