2009-10-07 6 views
8

は多くの場合、あなたのようなもので終わります。C++テンプレートのマクロのショートカット

// 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) 
    ... 
}; 

これはクリーナーようだ、と私は他のテンプレートクラスを作る際に重複を避けることは価値があるようなものを作成することです。これはいいことですか?あるいは、これを避け、typedefをコピー・ペーストするだけでいいですか?

答えて

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

+2

+1これはまた、ファンクタを単項関数および二項関数から継承する理由です。実際に関連する質問がありました。** the_classのtypedefを**使用する方法はいくつかありますが(http://www.parashift.com/c++-faq-lite/templates.htmlからいくつかのメタプログラミングブードゥーを使って取得しているとします) #faq-35.18意味のある*道はないと思われます... – UncleBens

+1

-1私から。私は、この解決策に「依存する基底クラスに見つからない名前」の問題に同意します。これらのメンバーのいずれかへのすべての参照は、次のように修飾する必要があります。 "typename template_defs ::"たとえば、 "const_reference"を参照したい場合は、 "typename template_defs :: const_reference"と言ってください。これはあまり良くありません。しかし、マクロバージョンとテンプレートを混在させたソリューションはOKかもしれません。 –