Improved range detection supporting ADL

This commit is contained in:
Gudmundur Adalsteinsson
2019-05-31 12:09:20 +00:00
parent 2d496cb296
commit f412ea9e34
4 changed files with 119 additions and 16 deletions

25
zmq.hpp
View File

@@ -156,6 +156,22 @@ namespace zmq
#ifdef ZMQ_CPP11
namespace detail
{
namespace ranges
{
using std::begin;
using std::end;
template<class T>
auto begin(T&& r) -> decltype(begin(std::forward<T>(r)))
{
return begin(std::forward<T>(r));
}
template<class T>
auto end(T&& r) -> decltype(end(std::forward<T>(r)))
{
return end(std::forward<T>(r));
}
} // namespace ranges
template<class T> using void_t = void;
template<class Iter>
@@ -163,7 +179,7 @@ using iter_value_t = typename std::iterator_traits<Iter>::value_type;
template<class Range>
using range_iter_t = decltype(
std::begin(std::declval<typename std::remove_reference<Range>::type &>()));
ranges::begin(std::declval<typename std::remove_reference<Range>::type &>()));
template<class Range>
using range_value_t = iter_value_t<range_iter_t<Range>>;
@@ -176,8 +192,8 @@ template<class T>
struct is_range<
T,
void_t<decltype(
std::begin(std::declval<typename std::remove_reference<T>::type &>())
== std::end(std::declval<typename std::remove_reference<T>::type &>()))>>
ranges::begin(std::declval<typename std::remove_reference<T>::type &>())
== ranges::end(std::declval<typename std::remove_reference<T>::type &>()))>>
: std::true_type
{
};
@@ -316,7 +332,8 @@ class message_t
detail::is_range<Range>::value
&& std::is_trivially_copyable<detail::range_value_t<Range>>::value
&& !std::is_same<Range, message_t>::value>::type>
explicit message_t(const Range &rng) : message_t(std::begin(rng), std::end(rng))
explicit message_t(const Range &rng) :
message_t(detail::ranges::begin(rng), detail::ranges::end(rng))
{
}
#endif