1. 程式人生 > >C++ 史上最華而不實的類

C++ 史上最華而不實的類

下面大家要看到這個類完全是扯淡,一無是處。它是由感而發於帖子C++的二維陣列轉置

當時,看完帖子我就在想,能不能用過載的方式實現邏輯轉置?只是好奇。C++顯然是不能過載兩個 [][] ,但是要達到這個效果,只要讓 [] 操作符返回一個指標即可。

問題是這樣根本做不到一個邏輯上的轉置,經與碼友討論生出用兩個類過載[]操作符這麼一條計策。於是,便產生了它。

它“華”到一個模板類中還定義有一個巢狀類,“不實”到沒有任何人會在工程當中用它。

#include <iostream>

template<typename T, size_t columns>
class TransMatrix {
  using Matrix = T(*)[columns];
  class Column {
   public:
    const T& operator[](const size_t column_index) const {
      return m_[column_index][line_index_];
    }   

   private:
    friend class TransMatrix;
    Column(const Matrix P, size_t lines) : m_(P), lines_(lines) { } 
    const Matrix m_; 
    const size_t lines_;
    size_t line_index_;
  };  

 public:
  TransMatrix(Matrix m, size_t lines) : column_(Column(m, lines)) { } 


  Column& operator[](const size_t line_index) {
    column_.line_index_ = line_index;
    return column_;
  }

 private:
  Column column_;
};

int main(int argc, char* argv[]) {
  constexpr int kColumns = 4;

  int a[3][kColumns] = { 
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
    { 9, 10, 11, 12 }
  };  

  TransMatrix<int, kColumns> trans(a, 3); 

  for (int i = 0; i < 4; i++) {
    for(int j = 0; j < 3; j++) {
      std::cout << trans[i][j] << ", ";
    }   
    std::cout << std::endl;
  }

  std::cout << std::endl;
}