#include <iostream>
static const double PI = 3.14159265358979323846;
// Forward declarations
template< typename T > class radians;
template< typename T > class degrees;
template< typename T >
class degrees
{
public:
degrees(const T value)
: value_(value)
{}
template< typename U >
explicit operator U() const
{
return value_ * PI / 180.0;
}
T value() const { return value_; }
private:
T value_;
};
template< typename T >
class radians
{
public:
radians(const T value)
: value_(value)
{}
template< typename U >
explicit operator U() const
{
return (value_* 180.0) / PI;
}
T value() const { return value_; }
private:
T value_;
};
template< typename T >
std::ostream& operator<<(std::ostream& out, const radians<T>& r)
{
return out << r.value() << "r";
}
template< typename T >
std::ostream& operator<<(std::ostream& out, const degrees<T>& r)
{
return out << r.value() << "d";
}
int main()
{
using degs = degrees<float>;
using rads = radians<float>;
auto d = degs{10};
auto r = static_cast<rads>(d);
std::cout << d << std::endl;
std::cout << r << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RhdGljIGNvbnN0IGRvdWJsZSBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7CgovLyBGb3J3YXJkIGRlY2xhcmF0aW9ucwp0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+IGNsYXNzIHJhZGlhbnM7CnRlbXBsYXRlPCB0eXBlbmFtZSBUID4gY2xhc3MgZGVncmVlczsKCnRlbXBsYXRlPCB0eXBlbmFtZSBUID4KY2xhc3MgZGVncmVlcwp7CnB1YmxpYzoKCWRlZ3JlZXMoY29uc3QgVCB2YWx1ZSkKCQk6IHZhbHVlXyh2YWx1ZSkKCXt9CgoJdGVtcGxhdGU8IHR5cGVuYW1lIFUgPgoJZXhwbGljaXQgb3BlcmF0b3IgVSgpIGNvbnN0Cgl7CgkJcmV0dXJuIHZhbHVlXyAqIFBJIC8gMTgwLjA7Cgl9CgoJVCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQoKcHJpdmF0ZToKCVQgdmFsdWVfOwp9OwoKCnRlbXBsYXRlPCB0eXBlbmFtZSBUID4KY2xhc3MgcmFkaWFucwp7CnB1YmxpYzoKCXJhZGlhbnMoY29uc3QgVCB2YWx1ZSkKCQk6IHZhbHVlXyh2YWx1ZSkKCXt9CgoJdGVtcGxhdGU8IHR5cGVuYW1lIFUgPgoJZXhwbGljaXQgb3BlcmF0b3IgVSgpIGNvbnN0Cgl7CgkJcmV0dXJuICh2YWx1ZV8qIDE4MC4wKSAvIFBJOwoJfQoKCVQgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KCnByaXZhdGU6CglUIHZhbHVlXzsKfTsKCnRlbXBsYXRlPCB0eXBlbmFtZSBUID4Kc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCByYWRpYW5zPFQ+JiByKQp7CglyZXR1cm4gb3V0IDw8IHIudmFsdWUoKSA8PCAiciI7Cn0KCnRlbXBsYXRlPCB0eXBlbmFtZSBUID4Kc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCBkZWdyZWVzPFQ+JiByKQp7CglyZXR1cm4gb3V0IDw8IHIudmFsdWUoKSA8PCAiZCI7Cn0KCgppbnQgbWFpbigpCnsKCXVzaW5nIGRlZ3MgPSBkZWdyZWVzPGZsb2F0PjsKCXVzaW5nIHJhZHMgPSByYWRpYW5zPGZsb2F0PjsKCglhdXRvIGQgPSBkZWdzezEwfTsKCWF1dG8gciA9IHN0YXRpY19jYXN0PHJhZHM+KGQpOwoKCXN0ZDo6Y291dCA8PCBkIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCByIDw8IHN0ZDo6ZW5kbDsKCglyZXR1cm4gMDsKfQ==