#include <iostream>
#include <cstdarg>
#include <boost/type_traits.hpp>
using namespace std;
// for pod
template<typename Type>
Type sum(size_t n, ...) {
typedef typename boost::promote<Type>::type PromotedType;
va_list pa;
Type sum = static_cast<PromotedType>(0);
va_start(pa, n);
while(n--)
sum += va_arg(pa, PromotedType);
va_end(pa);
return static_cast<Type>(sum);
}
int main() {
cout << "correct:" << sum<unsigned> (2, 1, 2) << endl;
cout << "error :" << sum<int> (2, 1.0, 2.0) << endl;
cout << "correct:" << sum<double> (2, 1.0, 2.0) << endl;
cout << "error :" << sum<float> (2, 1.0f, 2.0f) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGFyZz4KI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzLmhwcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBmb3IgcG9kCnRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+ClR5cGUgc3VtKHNpemVfdCBuLCAuLi4pIHsKICAgIHR5cGVkZWYgdHlwZW5hbWUgYm9vc3Q6OnByb21vdGU8VHlwZT46OnR5cGUgUHJvbW90ZWRUeXBlOwogICAgdmFfbGlzdCBwYTsKICAgIFR5cGUgc3VtID0gc3RhdGljX2Nhc3Q8UHJvbW90ZWRUeXBlPigwKTsKICAgIHZhX3N0YXJ0KHBhLCBuKTsKICAgIHdoaWxlKG4tLSkKICAgICAgICBzdW0gKz0gdmFfYXJnKHBhLCBQcm9tb3RlZFR5cGUpOwogICAgdmFfZW5kKHBhKTsKICAgIHJldHVybiBzdGF0aWNfY2FzdDxUeXBlPihzdW0pOwp9CgppbnQgbWFpbigpIHsKICAgIGNvdXQgPDwgImNvcnJlY3Q6IiAgIDw8IHN1bTx1bnNpZ25lZD4gKDIsIDEsIDIpIDw8IGVuZGw7CiAgICBjb3V0IDw8ICJlcnJvciAgOiIgICA8PCBzdW08aW50PiAgICgyLCAxLjAsIDIuMCkgPDwgZW5kbDsKICAgIGNvdXQgPDwgImNvcnJlY3Q6IiAgIDw8IHN1bTxkb3VibGU+ICgyLCAxLjAsIDIuMCkgPDwgZW5kbDsKICAgIGNvdXQgPDwgImVycm9yICA6IiAgIDw8IHN1bTxmbG9hdD4gKDIsIDEuMGYsIDIuMGYpIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQo=