Kha*_*sar 7 c++ templates idioms traits
什么时候将traits作为模板参数传递,而不是简单地使用一些现有的traits结构
typedef basic_ofstream< char, char_traits<char> >
与
typedef basic_ofstream< char >?
我有一些瓷砖类,我希望有一些共同点(特征),所以我设计tile_traits包含有关瓷砖的所有基本信息,例如int_type和flag_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.
}
Run Code Online (Sandbox Code Playgroud)
设计特征是否被视为特征 - 特征?
How*_*ant 13
特征的设计与其他任何东西一样多.这里没有硬性和快速的答案.我相信这个问题没有得到解决,因为如果不了解你正在解决的问题,就不可能给出一个好的答案.
一般来说,traits类是一个有用的"定制点".也就是说,如果您正在设计模板:
template <class Tile>
class TileContainer
{
...
};
Run Code Online (Sandbox Code Playgroud)
TileContainer可能会利用tile_traits<Tile>Tile的某些属性.并且当默认特征(如果存在)不正确时,客户端TileContainer可以专门tile_traits<MyTile>用于传达属性的变体.
到目前为止,我认为我没有说过任何你不知道的事情(根据你的问题的措辞来判断).
我想你的问题是:
你应该设计:
一个)
template <class Tile, class Traits = tile_traits<Tile>>
class TileContainer
{
// uses Traits
};
Run Code Online (Sandbox Code Playgroud)
要么:
B)
template <class Tile>
class TileContainer
{
// uses tile_traits<Tile>
};
Run Code Online (Sandbox Code Playgroud)
在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;
Run Code Online (Sandbox Code Playgroud)
例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;
Run Code Online (Sandbox Code Playgroud)
我唯一的建议是没有正确或错误的设计.使用:
template <class Tile>
class TileContainer
{
// uses tile_traits<Tile>
};
Run Code Online (Sandbox Code Playgroud)
当您确信通过专业化始终可以满足客户的需求时
tile_traits<MyTile>.
使用:
template <class Tile, class Traits = tile_traits<Tile>>
class TileContainer
{
// uses Traits
};
Run Code Online (Sandbox Code Playgroud)
当您怀疑您的客户可能需要相同Tile的不同特征时,或者当您使用除tile_traits之外的某些特征时强制TileContainer的类型不同时.
如果您可以看到人们会为同一数据类型传递不同的特征,则需要将traits类作为模板参数.如果你的瓷砖每个T都有相同的tile_traits,你可以直接使用它.
如果您可以看到有人会使用my_special_traits,则需要将其作为单独的模板参数.