#include <iostream>
#include <list>
#include <vector>
template <typename T>
class test
{
public:
template <typename I>
auto call(I first, I last) const
-> decltype(T()(first, last))
{
return T()(first, last);
}
};
template <typename T>
struct sum
{
template <typename I>
T operator()(I first, I last) const
{
T res = 0;
while (first != last)
{
res += *first;
++first;
}
return res;
}
};
int main()
{
test<sum<double>> t;
double a[] {1.,2.,3.};
std::cout << "Test (array) => " << t.call(a, a+3) << std::endl;
std::vector<double> v {1.,2.,3.};
std::cout << "Test (vector) => " << t.call(v.begin(), v.end()) << std::endl;
std::list<double> l {1.,2.,3.};
std::cout << "Test (list) => " << t.call(l.begin(), l.end()) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyB0ZXN0CnsKcHVibGljOgogIHRlbXBsYXRlIDx0eXBlbmFtZSBJPgogIGF1dG8gY2FsbChJIGZpcnN0LCBJIGxhc3QpIGNvbnN0CiAgIC0+IGRlY2x0eXBlKFQoKShmaXJzdCwgbGFzdCkpCiAgewogICAgcmV0dXJuIFQoKShmaXJzdCwgbGFzdCk7CiAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBzdW0KewogIHRlbXBsYXRlIDx0eXBlbmFtZSBJPgogIFQgb3BlcmF0b3IoKShJIGZpcnN0LCBJIGxhc3QpIGNvbnN0CiAgewogICAgVCByZXMgPSAwOwogICAgd2hpbGUgKGZpcnN0ICE9IGxhc3QpCiAgICB7CiAgICAgIHJlcyArPSAqZmlyc3Q7CiAgICAgICsrZmlyc3Q7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KfTsKCmludCBtYWluKCkKewogIHRlc3Q8c3VtPGRvdWJsZT4+IHQ7CiAgZG91YmxlIGFbXSB7MS4sMi4sMy59OwogIHN0ZDo6Y291dCA8PCAiVGVzdCAoYXJyYXkpID0+ICIgPDwgdC5jYWxsKGEsIGErMykgPDwgc3RkOjplbmRsOwogIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdiB7MS4sMi4sMy59OwogIHN0ZDo6Y291dCA8PCAiVGVzdCAodmVjdG9yKSA9PiAiIDw8IHQuY2FsbCh2LmJlZ2luKCksIHYuZW5kKCkpIDw8IHN0ZDo6ZW5kbDsKICBzdGQ6Omxpc3Q8ZG91YmxlPiBsIHsxLiwyLiwzLn07CiAgc3RkOjpjb3V0IDw8ICJUZXN0IChsaXN0KSA9PiAiIDw8IHQuY2FsbChsLmJlZ2luKCksIGwuZW5kKCkpIDw8IHN0ZDo6ZW5kbDsKfQoK