fork download
  1. #include <cstddef>
  2. #include <iostream>
  3.  
  4. template<typename Dst,typename Src>
  5. Dst* pointer_cast(Src *ptr){
  6. return static_cast<Dst*>(static_cast<void*>(ptr));
  7. }
  8. template<typename Dst,typename Src>
  9. Dst* pointer_cast(Src const* ptr){
  10. return static_cast<Dst*>(static_cast<void const*>(ptr));
  11. }
  12.  
  13. class Vector{
  14. protected:
  15. char *data;
  16. std::size_t elem_size;
  17.  
  18. Vector(std::size_t size) : data(new char[3*size]),elem_size(size){
  19. }
  20.  
  21. char *at(std::size_t index){
  22. return data + elem_size * index;
  23. }
  24. char const* at(std::size_t index) const{
  25. return data + elem_size * index;
  26. }
  27.  
  28. void doSomething();
  29. };
  30. void Vector::doSomething(){
  31. //処理が隠蔽できる
  32. }
  33. template<typename T>
  34. class Vector_ : Vector{
  35. public:
  36. Vector_() : Vector(sizeof(T)){
  37. }
  38.  
  39. T &operator [](std::size_t index){
  40. return *pointer_cast<T>(this->at(index));
  41. }
  42. T const& operator[](std::size_t index) const{
  43. return *pointer_cast<T const>(this->at(index));
  44. }
  45. };
  46. template<typename T>
  47. std::ostream& operator <<(std::ostream& os,Vector_<T> const& v){
  48. return os << '[' << v[0] << ',' << v[1] << ',' << v[2] << ']';
  49. }
  50.  
  51. int main(){
  52. Vector_<int> v;
  53. v[0] = 1;
  54. v[1] = 2;
  55. v[2] = 3;
  56. std::cout << v << std::endl;
  57.  
  58. Vector_<double> v2;
  59. v2[0] = 0.0;
  60. v2[1] = 3.14;
  61. v2[2] = 2.71;
  62. std::cout << v2 << std::endl;
  63. return 0;
  64. }
  65.  
Success #stdin #stdout 0s 3028KB
stdin
Standard input is empty
stdout
[1,2,3]
[0,3.14,2.71]