2016-03-15 117 views
3

考慮一下這段代碼。代碼的作用並不重要,但是如何編寫模板樣板代碼。C++模板和C預處理器

從樣板角度來看,代碼有一些重要的優點。

  • 更少的樣板代碼。

  • 如果你決定採取更多的模板參數,你只改變類的定義和#define

缺點也很明顯:使用預處理

  • 不是那麼可讀

  • 只是奇怪

    • 有什麼像這樣標準化?


      #include <cstdio> 
      
      template<typename T> 
      struct Summator{ 
          Summator(T v1, T v2); 
      
          T value1(); 
          T value2(); 
      
          T sum(); 
      
          bool great(); 
      
      private: 
          T v1; 
          T v2; 
      }; 
      
      
      #define Summator_(type) template<typename T> type Summator<T> 
      
      
      Summator_()::Summator(T v1, T v2) : v1(v1), v2(v2){}; 
      
      Summator_(T)::value1(){ 
          return v1; 
      } 
      
      Summator_(T)::value2(){ 
          return v1; 
      } 
      
      Summator_(T)::sum(){ 
          return v1 + v2; 
      } 
      
      Summator_(bool)::great(){ 
          return v1 > v2; 
      } 
      
      int main(){ 
          Summator<int> s{ 5, 6 }; 
      
          printf("%d\n", s.sum()); 
      } 
      
    +0

    最接近的可能是['標準::累加()'](http://en.cppreference.com/w/cpp/algorithm/accumulate)。 –

    +2

    @πάνταῥεῖ我認爲他指的是使用'Summator_'來縮寫模板定義* shiver *。 – TartanLlama

    +0

    不知道我是否理解這個問題,但爲什麼不使用C++ 11'using'指令? –

    回答

    1

    如果我正確理解你的問題,你想避免必須在每個函數定義前面寫出整個模板?

    我想大多數關心這個的人依靠IDE來生成空的函數定義/重構現有函數?

    我不使用宏的是這是一個好主意,只是爲了節省一點點的打字想,感覺就像是在製作維護的噩夢。

    1

    考慮到最實用的目的,類模板的成員函數必須是內聯,你還不如在電話的身體來定義他們。特別是對於這樣的小功能。

    顯然真正的類模板可能有一個或兩個不平凡的功能 - 但是你只需要對那些一個或兩個函數的鍋爐板。

    有標準,以幫助這個定義沒有什麼,我不知道我希望這是。如果你必須這樣做,請記住在之後#undef定義(否則你將污染你的類的用戶的#define命名空間)。

    0

    少得多樣板代碼。

    不,這是相同的

    如果你決定採取更多的模板參數,你只改變類的定義和#定義。

    讀:如果你決定徹底改變設計...也許你可以使用預處理

    燁(再後來,也許不是)節省一些打字

    - 所以這是一個沒有權利在那裏。

    不是那麼可讀

    所以 「不」 再次

    只是奇怪

    無關

    有什麼標準化的這樣嗎?

    顯然不是