#include <iostream>
#include <vector>
#include <type_traits>
template<typename T>
struct Typer { typedef T type; };
template<typename T>
struct Typer<const T> { typedef T type; };
template<typename Iter>
void sumout(Iter first, Iter last) {
typedef typename Typer<typename Iter::value_type>::type Value;
Value v = 0;
for (; first != last; (void) ++first) { v += *first; }
bool cv = std::is_const<Value>::value;
std::cout << (cv ? "const " : "") << typeid(v).name() << ": " << v;
}
int main() {
std::vector<int> v = { 1, 2, 3 };
sumout(v.cbegin(), v.cend());
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgVHlwZXIgeyB0eXBlZGVmIFQgdHlwZTsgfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBUeXBlcjxjb25zdCBUPiB7IHR5cGVkZWYgVCB0eXBlOyB9OwoKdGVtcGxhdGU8dHlwZW5hbWUgSXRlcj4Kdm9pZCBzdW1vdXQoSXRlciBmaXJzdCwgSXRlciBsYXN0KSB7CiAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVyPHR5cGVuYW1lIEl0ZXI6OnZhbHVlX3R5cGU+Ojp0eXBlIFZhbHVlOwoKICAgIFZhbHVlIHYgPSAwOwogICAgZm9yICg7IGZpcnN0ICE9IGxhc3Q7ICh2b2lkKSArK2ZpcnN0KSB7IHYgKz0gKmZpcnN0OyB9CiAgICAKICAgIGJvb2wgY3YgPSBzdGQ6OmlzX2NvbnN0PFZhbHVlPjo6dmFsdWU7CiAgICBzdGQ6OmNvdXQgPDwgKGN2ID8gImNvbnN0ICIgOiAiIikgPDwgdHlwZWlkKHYpLm5hbWUoKSA8PCAiOiAiIDw8IHY7Cn0KCmludCBtYWluKCkgewogICAgc3RkOjp2ZWN0b3I8aW50PiB2ID0geyAxLCAyLCAzIH07CiAgICBzdW1vdXQodi5jYmVnaW4oKSwgdi5jZW5kKCkpOwp9