#include <iterator>
#include <type_traits>
#include <iostream>
#include <vector>
#include <list>
template<typename T>
typename
std::enable_if<
std::is_same<
typename T::iterator_category,
std::bidirectional_iterator_tag
>::value,
T
>::type
foo(T it)
{
std::cout << "bidirectional\n";
return it;
}
template<typename T>
typename
std::enable_if<
std::is_same<
typename T::iterator_category,
std::random_access_iterator_tag
>::value,
T
>::type
foo(T it)
{
std::cout << "random access\n";
return it;
}
template<typename T>
T* foo(T* it)
{
std::cout << "pointer\n";
return it;
}
int main()
{
std::list<int>::iterator it1;
std::vector<int>::iterator it2;
int* it3;
std::istream_iterator<int> it4;
foo(it1);
foo(it2);
foo(it3);
//foo(it4); // this one doesn't compile
}
ICAgICNpbmNsdWRlIDxpdGVyYXRvcj4KICAgICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDx2ZWN0b3I+CiAgICAjaW5jbHVkZSA8bGlzdD4KCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgdHlwZW5hbWUKICAgIHN0ZDo6ZW5hYmxlX2lmPAogICAgICAgIHN0ZDo6aXNfc2FtZTwKICAgICAgICAgICAgdHlwZW5hbWUgVDo6aXRlcmF0b3JfY2F0ZWdvcnksCiAgICAgICAgICAgIHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcKICAgICAgICA+Ojp2YWx1ZSwKICAgICAgICBUCiAgICA+Ojp0eXBlCiAgICBmb28oVCBpdCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImJpZGlyZWN0aW9uYWxcbiI7CiAgICAgICAgcmV0dXJuIGl0OwogICAgfQogICAgCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgdHlwZW5hbWUKICAgIHN0ZDo6ZW5hYmxlX2lmPAogICAgICAgIHN0ZDo6aXNfc2FtZTwKICAgICAgICAgICAgdHlwZW5hbWUgVDo6aXRlcmF0b3JfY2F0ZWdvcnksCiAgICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcKICAgICAgICA+Ojp2YWx1ZSwKICAgICAgICBUCiAgICA+Ojp0eXBlCiAgICBmb28oVCBpdCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgInJhbmRvbSBhY2Nlc3NcbiI7CiAgICAgICAgcmV0dXJuIGl0OwogICAgfQogICAgCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgVCogZm9vKFQqIGl0KQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAicG9pbnRlclxuIjsKICAgICAgICByZXR1cm4gaXQ7CiAgICB9CiAgICAKICAgIGludCBtYWluKCkKICAgIHsKICAgICAgICBzdGQ6Omxpc3Q8aW50Pjo6aXRlcmF0b3IgaXQxOwogICAgICAgIHN0ZDo6dmVjdG9yPGludD46Oml0ZXJhdG9yIGl0MjsKICAgICAgICBpbnQqIGl0MzsKICAgICAgICBzdGQ6OmlzdHJlYW1faXRlcmF0b3I8aW50PiBpdDQ7CiAgICAgICAgZm9vKGl0MSk7CiAgICAgICAgZm9vKGl0Mik7CiAgICAgICAgZm9vKGl0Myk7CiAgICAgICAgLy9mb28oaXQ0KTsgLy8gdGhpcyBvbmUgZG9lc24ndCBjb21waWxlCiAgICB9Cgo=