特质的设计与其他任何事物一样都是艺术。这里没有硬性和快速的答案。我相信这个问题没有得到解答,因为如果不了解更多关于您正在解决的问题,就不可能给出一个好的答案。
一般来说,特征类是一个有用的“定制点”。也就是说,如果您正在设计模板:
template <class Tile>
class TileContainer
{
...
};
TileContainer
可能会利用tile_traits<Tile>
Tile 的某些属性。当默认特征(如果存在)不正确时,客户端TileContainer
可以专门化tile_traits<MyTile>
以传达属性的变化。
到目前为止,我认为我没有说过任何你不知道的事情(从你的问题的措辞来看)。
我认为你的问题是:
你应该设计:
一种)
template <class Tile, class Traits = tile_traits<Tile>>
class TileContainer
{
// uses Traits
};
或者:
二)
template <class Tile>
class TileContainer
{
// uses tile_traits<Tile>
};
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
};
当您怀疑您的客户可能需要相同 Tile 的不同特征时,或者当您希望在使用 tile_traits 以外的某些特征时强制 TileContainer 的类型不同时。