2011-02-11 43 views
6

時候才傳遞性狀作爲模板參數,而不是簡單地使用一些現有的特質結構喜歡性狀並通過性狀模板參數

typedef basic_ofstream< char, char_traits<char> >

typedef basic_ofstream<char>

我有一些瓷磚類,我想有一些共同點(特徵),所以我設計tile_traits包含所有關於貼片的基本信息,如int_typeflag_type,像這樣:

//unspecialized 
template<typename T> struct tile_traits; 
//... other stuff here, declaration of a tile class 
template<> 
struct tile_traits<tile_class> 
{ 
    typedef tile_class::int_type int_type; 
    typedef tile_class::flag_type flag_type; 
    //other possible tile info here. 
} 

正在設計性狀這樣算特質,BLOB

+0

期限特徵二進制大對象是未知的我。這是另外一個問題http://stackoverflow.com/questions/1870627/type-traits-definition-traits-blobs-metafunctions – Suma 2011-02-13 16:31:04

回答

12

性狀的設計和其他任何東西一樣多。這裏沒有難度和 的快速答案。我相信這個問題一直沒有得到答覆,因爲它是 不可能給出一個很好的答案不知道了很多關於 你要解決的問題。

一般性狀類是有用的「定製點」。也就是說,如果你 正在設計一個模板:

template <class Tile> 
class TileContainer 
{ 
    ... 
}; 

TileContainer可能利用tile_traits<Tile>對於小塊的一些性質。 而TileContainer的客戶端可以專門tile_traits<MyTile>爲了 溝通變化的屬性時,默認特質(如果存在) 是不正確的。

到目前爲止,我不認爲我已經說過任何你不知道的事情(從 來看你的問題的措辭)。

我覺得你的問題是:

你應該設計:

A)

template <class Tile, class Traits = tile_traits<Tile>> 
class TileContainer 
{ 
    // uses Traits 
}; 

或:

B)

template <class Tile> 
class TileContainer 
{ 
    // uses tile_traits<Tile> 
}; 

有實例d在C++ 03和即將到來的C++ 0x標準中發揮作用。

例A的設計:

template<class charT, class traits = char_traits<charT>, 
         class Allocator = allocator<charT>> 
    class basic_string; // both traits and Allocator are traits 

template <class Codecvt, class Elem = wchar_t, 
         class Tr = char_traits<Elem>> 
    class wbuffer_convert; 

template <class T, class Allocator = allocator<T>> 
    class vector; // Allocator is a A-trait that uses another 
        // B-trait internally: allocator_traits<Allocator> 

template <class charT, class traits = regex_traits<charT>> 
    class basic_regex; 

實例B設計:

template<class Iterator> struct iterator_traits; 
template <class Alloc> struct allocator_traits; 
template <class Ptr> struct pointer_traits; 
template <class Rep> struct treat_as_floating_point; 
template <class Rep> struct duration_values; 

我唯一的建議是,有沒有正確或錯誤的設計。用途:

template <class Tile> 
class TileContainer 
{ 
    // uses tile_traits<Tile> 
}; 

當你確信你的客戶的需求總是可以通過專業 tile_traits<MyTile>得到滿足。

用途:

template <class Tile, class Traits = tile_traits<Tile>> 
class TileContainer 
{ 
    // uses Traits 
}; 
當你懷疑你的客戶可能需要不同的性狀相同 瓷磚,或當你想強制TileContainer的類型是不同的,當 一些特質以外tile_traits是

用過的。

+0

這幾乎總結我的問題關於#1的所有疑慮。我想答案問題#2是,正如你所說的,幾乎不可能有一個很好的答案,是相當多的相關的風格,我想我可以去什麼** C++模板元編程**對此有什麼看法它現在 – 2011-02-13 20:16:32

6

你需要有traits類作爲模板參數,如果你能看到人們會通過不同的性狀相同的數據類型。如果你的瓷磚對於每個T總是有相同的tile_traits,那麼你可以直接使用它。

如果你能看到有人,有時候,會使用my_special_traits,你需要有一個單獨的模板參數。

1

看到你可以爲特質提供默認值,並具有特徵參數始終是比較靈活的,除非你有一些具體的原因,你不能這樣做,我會選擇這種方式。

template<class Bar,class Traits=FooTraits<Bar> > 
class Foo 
{}; 
+0

提到過一次讀問題多,我承認,答案也許是不相關的,作爲第二閱讀我不知道這個問題是什麼。它看起來與Foo模板類的定義沒有關係,只與特徵本身有關。在那裏,答案很簡單:當一個現成的特質適合你,使用它們,不用時,提供你自己的。 – Suma 2011-02-13 16:29:17