7

単純にいくつかの既存の特性構造体を使用するのではなく、テンプレート パラメーターとして特性を渡すことが実用的なのはいつですか?

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.
}

そのような特性を設計することは特性ブロブと見なされますか?

4

3 に答える 3

13

特性の設計は、何よりも芸術的です。ここには、厳密で迅速な答えはありません。あなたが解決している問題についてもっと多くのことを知らなければ、良い答えを出すことは不可能であるため、この質問は答えられていないと思います.

一般に、特性クラスは便利な「カスタマイズ ポイント」です。つまり、テンプレートを設計している場合:

template <class Tile>
class TileContainer
{
    ...
};

TileContainertile_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 のタイプを強制的に異なるものにしたい場合。

于 2011-02-13T18:53:09.480 に答える
6

人々が同じデータ型に対して異なる特性を渡すことがわかる場合は、テンプレートパラメータとして特性クラスを用意する必要があります。タイルが各Tに対して常に同じtile_traitsを持つ場合は、それを直接使用できます。

誰かがmy_special_traitsを使用することがある場合は、それを別のテンプレートパラメータとして使用する必要があります。

于 2011-02-13T16:21:35.607 に答える
1

トレイトのデフォルト値を提供でき、トレイトパラメータを常に柔軟に設定できることを考えると、それができない特別な理由がない限り、このアプローチを選択します。

template<class Bar,class Traits=FooTraits<Bar> >
class Foo
{};
于 2011-02-13T16:24:27.500 に答える