2009-12-08 50 views
7

讀一些源代碼,我發現下一個特徵定義:類型特徵定義。性狀斑點和元函數

namespace dds { 
    template <typename Topic> struct topic_type_support { }; 
    template <typename Topic> struct topic_data_writer { }; 
    template <typename Topic> struct topic_data_reader { }; 
    template <typename Topic> struct topic_data_seq { }; 
} 

#define REGISTER_TOPIC_TRAITS(TOPIC) \ 
namespace dds { \ 
    template<> struct topic_type_support<TOPIC> { \ 
     typedef TOPIC##TypeSupport type; }; \ 
    template<> struct topic_data_writer<TOPIC> { \ 
     typedef TOPIC##DataWriter type; }; \ 
    template<> struct topic_data_reader<TOPIC> { \ 
     typedef TOPIC##DataReader type; }; \ 
    template<> struct topic_data_seq<TOPIC> { \ 
     typedef TOPIC##Seq type; }; \ 
} 

這看起來怪我。我會分組所有性狀獨特的一類這樣的:

namespace dds { 
    template <typename Topic> struct topic_traits { }; 
} 

#define REGISTER_TOPIC_TRAITS(TOPIC) \ 
namespace dds { \ 
    template<> struct topic_traits<TOPIC> { \ 
     typedef TOPIC##TypeSupport type_support; \ 
     typedef TOPIC##DataWriter data_writter; \ 
     typedef TOPIC##DataReader data_reader; \ 
     typedef TOPIC##Seq seq_type; \ 
    }; \ 
} 

任何你能弄清楚爲什麼第二種方法可能會比第一個或顯著很難增加新的特徵更加脆弱?

回答

5

擁有單個模板類現在稱爲「特徵blob」。不推薦使用「特徵blob」,因爲它們不適用於元函數(即編譯時函數)。

元函數是一個模板,它接受一個類並對其執行一些操作。喜歡的東西:

template <class T> 
class metafunction 
{ 
    typename T::type value = ...; 
} 

然後,您可以通過做要求你的任何特徵的元功能:

metafunction<topic_type_support<int> >::value; 
metafunction<topic_data_writer<int> >::value; 

您將無法調用元函數的特徵斑點類,因爲那裏現在是告訴元函數使用哪種typedef的方法。

如果你想了解更多關於元功能的知識,我推薦本書C++ Template Metaprogramming

+0

欲瞭解更多元編程谷歌助推MPL – KitsuneYMG 2009-12-09 04:31:51

+0

@Samuel:特質blob。那是我正在尋找的名字!謝謝。我已經訂購了亞伯拉罕書。 – 2009-12-12 11:03:21

1

這是一個風格問題。你的例子可能更易於維護,但是具有不同的類型確實賦予它們獨立的優點 - 你可以很容易地專門化所有指針類型,例如topic_data_reader,但是讓其他的指針類型不被專門化。

如果要深究下去,我會質疑缺乏默認的:

namespace dds { 
    template <typename Topic> struct topic_traits { 
    typedef typename Topic::type_support type_support; 
    typedef typename Topic::data_writer data_writer; 
    typedef typename Topic::data_reader data_reader; 
    typedef typename Topic::seq_type seq_type; 
    }; 
} 

這種方法意味着任何提供必要的typedef類,自動合格。宏仍然可以用來生成這些類型定義或專門化類,但這可能不是必需的(特別是seq_type看起來像可疑的類似於它通常是typedef,而不是用戶定義的類型)。

編輯:具有較大的特徵類,分離出來的東西可以用來減少實例化所需的數量,但是如果你的特徵類有元素使用一個可能意味着你使用其他元素,這沒有增加任何好處。

相關問題