#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;
}