2009-10-07 59 views
8

經常使用模板的時候,你最終的東西,如:C++模板的宏快捷

template <T> 
class the_class 
{ 
public: 
    // types 
    typedef T value_type; 
    typedef const value_type const_value_type; 

    typedef value_type& reference; 
    typedef const_value_type& const_reference; 

    typedef value_type* pointer; 
    typedef const_value_type* const_pointer; 

    ... 
}; 

這是同樣的東西很多的,不過,複製到許多不同的模板類的。這是值得創造的東西,如:

// template_types.h 

#define TEMPLATE_TYPES(T) \ 
     typedef T value_type; \ 
     typedef const value_type const_value_type; \ 
     typedef value_type& reference; \ 
     typedef const_value_type& const_reference; \ 
     typedef value_type* pointer; \ 
     typedef const_value_type* const_pointer; 

所以我剛纔類變爲:

#include "template_types.h" 

template <typename T> 
class the_class 
{ 
public: 
    TEMPLATE_TYPES(T) 
    ... 
}; 

這似乎更清潔,並避免重複,當我做其他的模板類。這是一件好事嗎?或者我應該避免這種情況,只是複製粘貼typedefs?

回答

15

當然,你在做什麼可以工作,但它是一種老派。你是否試圖將這些東西放入另一個可以派生出來的模板類中?

template <typename T> 
class template_defs 
{ 
public: 
    // types 
    typedef T value_type; 
    typedef const value_type const_value_type; 
    typedef value_type& reference; 
    typedef const_value_type& const_reference; 
    typedef value_type* pointer; 
    typedef const_value_type* const_pointer; 
}; 

template <typename T> 
class the_class : public template_defs<T> 
... 
+1

謝謝,我甚至沒有想到這一點。 – Corey 2009-10-07 23:22:28

+2

+1這也是爲什麼從一元函數和二元函數繼承函子的原因。我實際上有一個相關的問題,如何在**類中使用這些typedefs(假設它們是通過一些元編程巫術獲得的),但是來自http://www.parashift.com/c++-faq-lite/templates.html #faq-35.18它看起來沒有*有意義的方式...... – UncleBens 2009-10-07 23:29:49

+1

-1從我這裏。由於「在相關基類中找不到名稱」問題,我不同意這種解決方案。每一個對這些成員之一的引用必須被限定如下:「typename template_defs ::」。例如,如果你想引用「const_reference」,你不得不說「typename template_defs :: const_reference」,這不是更好。但是,將宏版本與模板混合的解決方案可能沒問題。 – 2009-10-08 08:36:02