fork(1) download
  1. #include <iostream>
  2.  
  3. static const double PI = 3.14159265358979323846;
  4.  
  5. // Forward declarations
  6. template< typename T > class radians;
  7. template< typename T > class degrees;
  8.  
  9. template< typename T >
  10. class degrees
  11. {
  12. public:
  13. degrees(const T value)
  14. : value_(value)
  15. {}
  16.  
  17. template< typename U >
  18. explicit operator U() const
  19. {
  20. return value_ * PI / 180.0;
  21. }
  22.  
  23. T value() const { return value_; }
  24.  
  25. private:
  26. T value_;
  27. };
  28.  
  29.  
  30. template< typename T >
  31. class radians
  32. {
  33. public:
  34. radians(const T value)
  35. : value_(value)
  36. {}
  37.  
  38. template< typename U >
  39. explicit operator U() const
  40. {
  41. return (value_* 180.0) / PI;
  42. }
  43.  
  44. T value() const { return value_; }
  45.  
  46. private:
  47. T value_;
  48. };
  49.  
  50. template< typename T >
  51. std::ostream& operator<<(std::ostream& out, const radians<T>& r)
  52. {
  53. return out << r.value() << "r";
  54. }
  55.  
  56. template< typename T >
  57. std::ostream& operator<<(std::ostream& out, const degrees<T>& r)
  58. {
  59. return out << r.value() << "d";
  60. }
  61.  
  62.  
  63. int main()
  64. {
  65. using degs = degrees<float>;
  66. using rads = radians<float>;
  67.  
  68. auto d = degs{10};
  69. auto r = static_cast<rads>(d);
  70.  
  71. std::cout << d << std::endl;
  72. std::cout << r << std::endl;
  73.  
  74. return 0;
  75. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
10d
0.174533r