特征和传递特征作为模板参数

Kha*_*sar 7 c++ templates idioms traits

什么时候将traits作为模板参数传递,而不是简单地使用一些现有的traits结构

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.
}
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的类型不同时.


Bo *_*son 6

如果您可以看到人们会为同一数据类型传递不同的特征,则需要将traits类作为模板参数.如果你的瓷砖每个T都有相同的tile_traits,你可以直接使用它.

如果您可以看到有人会使用my_special_traits,则需要将其作为单独的模板参数.