特性の設計は、何よりも芸術的です。ここには、厳密で迅速な答えはありません。あなたが解決している問題についてもっと多くのことを知らなければ、良い答えを出すことは不可能であるため、この質問は答えられていないと思います.
一般に、特性クラスは便利な「カスタマイズ ポイント」です。つまり、テンプレートを設計している場合:
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>
};
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_traits 以外の特性が使用されているときに TileContainer のタイプを強制的に異なるものにしたい場合。