特征的设计和其他任何东西一样都是艺术。没有硬和
在这里快速回答。我相信这个问题没有得到解答,因为它是
如果对问题有更多了解,不可能给出一个好的答案
你正在解决。
一般来说,特征类是一个有用的“定制点”。也就是说,如果你
正在设计模板:
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
};
或:
B)
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,或者当你想强制 TileContainer 的类型不同的时候
使用了 tile_traits 以外的一些 trait。