我想要一個機制在編譯時確定迭代器是否反向。確定一個(C++)迭代器是否反向
Iterator traits只能用類別的迭代器類型的和我需要的東西在的行幫助:
template<typename IterType>
struct IsReverseIterator
{
enum { Yes = /* Implementation of the mechanism */ };
}
我有一個解決方案,那有一個小缺點雖然,容器類型必須以及提供:
typedef char TrueT;
typedef struct { TrueT _[2]; } FalseT;
template<typename Cont> TrueT IsReverseIterator(typename Cont::const_reverse_iterator);
template<typename Cont> FalseT IsReverseIterator(...);
它使用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;
任何想法?
編輯
爲了解釋什麼,我尋找,就拿下面的代碼
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();
}
這是一個虛擬的例子,請不要陷入這樣的事實:我已經處理了這個代碼,或者我可能有兩個重載,一個是Cont::reverse_iterator
,一個是Cont::iterator
。我不/不能改變這種設計,我只是想用一種更優雅的方式(如果有的話)在內部處理它。我再次重申這是一個虛擬的例子。
什麼'reverse_iterator'? http://www.cplusplus.com/reference/iterator/reverse_iterator/ – Brian
@GIJoe他知道*什麼是*;他想知道,給定一個迭代器,*是否*是。 (我可能誤解了你的評論,雖然 – WhozCraig
@WhozCraig:我想這就是我的觀點......他已經知道他需要一個reverse_iterator,如果你傳遞一個reverse_iterator開始,我不會看到其他任何東西都會被接受的可能性 – Brian