我想要一种机制来在编译时确定迭代器是否是反向的.
迭代器特性只能帮助迭代器类型的类别,我需要的是以下几行:
template<typename IterType>
struct IsReverseIterator
{
enum { Yes = /* Implementation of the mechanism */ };
}
Run Code Online (Sandbox Code Playgroud)
我有一个解决方案,虽然有一个小缺点,但也必须提供容器类型:
typedef char TrueT;
typedef struct { TrueT _[2]; } FalseT;
template<typename Cont> TrueT IsReverseIterator(typename Cont::const_reverse_iterator);
template<typename Cont> FalseT IsReverseIterator(...);
Run Code Online (Sandbox Code Playgroud)
它明显使用SFINAE,可以这样使用:
std::vector<int> v;
std::cout << (sizeof(IsReverseIterator<std::vector<int>>(v.begin())) == sizeof(TrueT)) << std::endl;
std::cout << (sizeof(IsReverseIterator<std::vector<int>>(v.rbegin())) == sizeof(TrueT)) << std::endl;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑
要解释我正在搜索的内容,请参考以下代码
template<typename Cont, typename It>
bool points_to_last_element(Cont const &container, It iter)
{
return iter == container.rend();
// here I would like to dispatch to 2 implementations
// one for reverse iterators and one for forward where this would happen
// return iter == container.end();
}
Run Code Online (Sandbox Code Playgroud)
这是一个虚拟的例子,请不要抓住我已经处理它的代码或我可以有两个重载的事实,一个采取Cont::reverse_iterator和一个采取Cont::iterator.我不能/不能改变那种设计,我只是尝试一种更优雅的方式(如果有的话)在内部处理它.我再说一遍这是一个虚拟的例子.
#include <iterator>
#include <type_traits>
template<typename Iter>
struct is_reverse_iterator : std::false_type { };
template<typename Iter>
struct is_reverse_iterator<std::reverse_iterator<Iter>>
: std::integral_constant<bool, !is_reverse_iterator<Iter>::value>
{ };
Run Code Online (Sandbox Code Playgroud)
您还可以为任何反向迭代器的用户定义迭代器专门化特征.
| 归档时间: |
|
| 查看次数: |
448 次 |
| 最近记录: |