fork(2) download
  1. #include <iostream>
  2. #include <inttypes.h>
  3. #include <type_traits>
  4.  
  5. template <int F>
  6. struct fp
  7. {
  8. enum { BITS = F };
  9. int32_t s;
  10.  
  11. template<class B = int, typename std::enable_if<!std::is_same<B, int32_t>::value>::type...>
  12. fp(const int & b) : s(((int32_t)b) << F) { }
  13. fp(const int32_t & b) : s(b << F) { }
  14. fp(const float & b) : s(b * (1 << F)) { }
  15. template<int T>
  16. fp(const fp<T> & b) { *this = b; }
  17.  
  18. template<class B = int, typename std::enable_if<!std::is_same<B, int32_t>::value>::type...>
  19. fp & operator=(const int & b) { s = ((int32_t)b) << F; return *this; }
  20. fp & operator=(const int32_t & b) { s = b << F; return *this; }
  21. fp & operator=(const float & b) { s = b * (1 << F); return *this; }
  22. fp & operator=(const fp & b) { s = b.s; return *this; }
  23.  
  24. template<int T>
  25. fp & operator=(const fp<T> & b)
  26. {
  27. if (T > F) { s = b.s >> (T - F); }
  28. else if (T < F) { s = b.s << (F - T); }
  29. else { s = b.s; }
  30. return *this;
  31. }
  32.  
  33. /*fp & operator=(const int32_t & b)
  34. {
  35. s = b << F;
  36. return *this;
  37. }
  38.  
  39. fp & operator=(const float & b)
  40. {
  41. s = b * (1 << F);
  42. return *this;
  43. }*/
  44.  
  45. friend std::ostream & operator<<(std::ostream & os, const fp<F> & a) { os << a.s; return os; }
  46. };
  47.  
  48. using fp824 = fp<24>;
  49. using fp1616 = fp<16>;
  50. using fp248 = fp<8>;
  51.  
  52. int main() {
  53. // your code goes here
  54. fp1616 a0(0); // error: ambiguous?!
  55. fp1616 a1(1); // error: ambiguous?!
  56. fp1616 a2(2); // error: ambiguous?!
  57. fp1616 a3(-2.5f);
  58. std::cout << a0 << std::endl;
  59. std::cout << a1 << std::endl;
  60. std::cout << a2 << std::endl;
  61. std::cout << a3 << std::endl;
  62. a0 = 5; // error: ambiguous?!
  63. a0 = 0; // error: ambiguous?!
  64. a0 = 3.4f;
  65. fp824 b1(1.2f);
  66. fp1616 b2(b1);
  67. fp248 b3(b2);
  68. b1 = b3;
  69. b1 = b2;
  70. return 0;
  71. }
Success #stdin #stdout 0s 16048KB
stdin
Standard input is empty
stdout
0
65536
131072
-163840