#include <iostream>
#include <vector>
// Identify the type of element in given range type.
template<typename Range> struct range_elem {
typedef typename std::decay<decltype(*std::begin(std::declval<Range &>()))>::type type;
};
// Count the number of elements in range matching value.
template<typename Range>
int count(const Range& range, typename range_elem<Range>::type value) {
int n = 0;
for (const auto& e : range) { if (e==value) n++; }
return n;
}
int main() {
// This compiles OK.
std::vector<int> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3);
std::cerr << count(vec, 2) << "\n";
//
int ar[3] = {1,2,3};
// This compiles OK.
{
int n = 0;
for (const auto& e : ar) { if (e==2) n++; }
std::cerr << n << "\n";
}
// This fails to compile on gcc 4.8.1;
// error: no matching function for call to 'begin(int [3])'
std::cerr << count(ar, 2) << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKLy8gSWRlbnRpZnkgdGhlIHR5cGUgb2YgZWxlbWVudCBpbiBnaXZlbiByYW5nZSB0eXBlLgp0ZW1wbGF0ZTx0eXBlbmFtZSBSYW5nZT4gc3RydWN0IHJhbmdlX2VsZW0gewogICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PGRlY2x0eXBlKCpzdGQ6OmJlZ2luKHN0ZDo6ZGVjbHZhbDxSYW5nZSAmPigpKSk+Ojp0eXBlIHR5cGU7Cn07CgovLyBDb3VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHJhbmdlIG1hdGNoaW5nIHZhbHVlLgp0ZW1wbGF0ZTx0eXBlbmFtZSBSYW5nZT4KaW50IGNvdW50KGNvbnN0IFJhbmdlJiByYW5nZSwgdHlwZW5hbWUgcmFuZ2VfZWxlbTxSYW5nZT46OnR5cGUgdmFsdWUpIHsKICAgIGludCBuID0gMDsKICAgIGZvciAoY29uc3QgYXV0byYgZSA6IHJhbmdlKSB7IGlmIChlPT12YWx1ZSkgbisrOyB9CiAgICByZXR1cm4gbjsKfQoKaW50IG1haW4oKSB7CiAgICAvLyBUaGlzIGNvbXBpbGVzIE9LLgogICAgc3RkOjp2ZWN0b3I8aW50PiB2ZWM7IHZlYy5wdXNoX2JhY2soMSk7IHZlYy5wdXNoX2JhY2soMik7IHZlYy5wdXNoX2JhY2soMyk7CiAgICBzdGQ6OmNlcnIgPDwgY291bnQodmVjLCAyKSA8PCAiXG4iOwogICAgLy8KICAgIGludCBhclszXSA9IHsxLDIsM307CiAgICAvLyBUaGlzIGNvbXBpbGVzIE9LLgogICAgewogICAgICAgIGludCBuID0gMDsKICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGUgOiBhcikgeyBpZiAoZT09MikgbisrOyB9CiAgICAgICAgc3RkOjpjZXJyIDw8IG4gPDwgIlxuIjsKICAgIH0KICAgIC8vIFRoaXMgZmFpbHMgdG8gY29tcGlsZSBvbiBnY2MgNC44LjE7CiAgICAvLyAgZXJyb3I6IG5vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciBjYWxsIHRvICdiZWdpbihpbnQgWzNdKScKICAgIHN0ZDo6Y2VyciA8PCBjb3VudChhciwgMikgPDwgIlxuIjsKICAgIHJldHVybiAwOwp9