Is there a way to wrap the pattern into a general, template function?

```
template <typename C>
auto Begin(C&& c) -> ??? {
  using std::begin;
  return begin(std::forward<C>(c));
}

```

The question here is how to write the return type of the function here?

The reason I want this is I want to write a template variable

```
template <typename C>
constexpr bool IsBidirectionalContainer = 
  std::is_base_of<std::bidirectional_iterator_tag,
                  typename std::iterator_traits<
                      decltype(std::begin(std::declval<C>()))>::iterator_category>::value;

```

The problem here is the `std::begin` won't find custom overloads of `begin` for `C` via ADL. If anyone has workaround for this, it is welcome as well.