有没有办法将模式包装成一般的模板函数?
- template <typename C>
- auto Begin(C&& c) -> ??? {
- using std::begin;
- return begin(std::forward<C>(c));
- }
这里的问题是如何在这里编写函数的返回类型?
我想要这个的原因是我想写一个模板变量
- 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;
解决方法
您需要将其包装在另一个名称空间中,即:
- namespace details {
- using std::begin;
- template <typename C>
- auto Begin(C&& c) -> decltype(begin(std::forward<C>(c)))
- {
- return begin(std::forward<C>(c));
- }
- }
然后:
- template <typename C>
- constexpr bool IsBidirectionalContainer =
- std::is_base_of<std::bidirectional_iterator_tag,typename std::iterator_traits<
- decltype(details::Begin(std::declval<C>()))>::iterator_category>::value;
如果由于某种原因您拒绝在命名空间内定义Begin,则可以使用类型别名来绕过它.
- namespace details {
- using std::begin;
- template <typename C>
- using type = decltype(begin(std::forward<C>(c)));
- }
- template <typename C>
- auto Begin(C&& c) -> details::type<C>
- {
- return begin(std::forward<C>(c));
- }
虽然这可能比必要的工作更多.前瞻声明可能就足够了.