Сообщение Re: Перегрузка методов с лямбдами от 07.01.2017 17:57
Изменено 08.01.2017 17:48 Кодт
Re: Перегрузка методов с лямбдами
Здравствуйте, Kingofastellarwar, Вы писали:
Можно (взять готовый в C++17 или навелосипедить свой) is_callable и использовать его в SFINAE
Но, как уже сказали выше, лучше не создавать, а потом героически разруливать неоднозначность семантики, — а с самого начала завести contains и contains_if.
И кстати, с т.з. английского языка, the_container.contains(value), а не the_container.contain(value).
Предикат — в 3 лице ед.числе.
А внешняя функция-алгоритм — find, find_if — в инфинитиве/императиве.
Можно (взять готовый в C++17 или навелосипедить свой) is_callable и использовать его в SFINAE
template<class P> auto contains(P&& p) ->
// если существует и приводится к bool выражение p(t), где t - элемент коллекции
std::enable_if< std::is_convertible< declspec(p(std::declval<T>())), bool >::value, bool >
{ return std::find_if(std::begin(*this), std::end(*this), std::forward<T>(p)) != std::end(*this); }
template<class V> auto contains(V&& v) ->
// если существует и приводится к bool выражение t == v
std::enable_if< std::is_convertible< declspec(std::declval<T>() == v), bool >::value, bool >
{ return std::find(std::begin(*this), std::end(*this), std::forward<V>(v)) != std::end(*this); }
Но, как уже сказали выше, лучше не создавать, а потом героически разруливать неоднозначность семантики, — а с самого начала завести contains и contains_if.
И кстати, с т.з. английского языка, the_container.contains(value), а не the_container.contain(value).
Предикат — в 3 лице ед.числе.
А внешняя функция-алгоритм — find, find_if — в инфинитиве/императиве.
Re: Перегрузка методов с лямбдами
Здравствуйте, Kingofastellarwar, Вы писали:
Можно (взять готовый в C++17 или навелосипедить свой) is_callable и использовать его в SFINAE
Вот наколбасил эксперимент
http://ideone.com/SQNwIS
Но, как уже сказали выше, лучше не создавать, а потом героически разруливать неоднозначность семантики, — а с самого начала завести contains и contains_if.
И кстати, с т.з. английского языка, the_container.contains(value), а не the_container.contain(value).
Предикат — в 3 лице ед.числе.
А внешняя функция-алгоритм — find, find_if — в инфинитиве/императиве.
Можно (взять готовый в C++17 или навелосипедить свой) is_callable и использовать его в SFINAE
template<class P> auto contains(P&& p) ->
// если существует и приводится к bool выражение p(t), где t - элемент коллекции
std::enable_if< std::is_convertible< decltype(p(std::declval<T>())), bool >::value, bool >::type
{ return std::find_if(std::begin(*this), std::end(*this), std::forward<T>(p)) != std::end(*this); }
template<class V> auto contains(V&& v) ->
// если существует и приводится к bool выражение t == v
std::enable_if< std::is_convertible< decltype(std::declval<T>() == v), bool >::value, bool >::type
{ return std::find(std::begin(*this), std::end(*this), std::forward<V>(v)) != std::end(*this); }
Вот наколбасил эксперимент
http://ideone.com/SQNwIS
Скрытый текст | |
| |
Но, как уже сказали выше, лучше не создавать, а потом героически разруливать неоднозначность семантики, — а с самого начала завести contains и contains_if.
И кстати, с т.з. английского языка, the_container.contains(value), а не the_container.contain(value).
Предикат — в 3 лице ед.числе.
А внешняя функция-алгоритм — find, find_if — в инфинитиве/императиве.