オプションでコンテンツを適切に定義された順序で維持できる、テンプレート化された C++ 汎用コンテナー クラスを作成しています。以前は関数ポインターを使用して、適切な型固有の方法で内容を並べ替えていましたが、代わりにテンプレート化されたファンクター引数を使用するように変更しようとしています。
クラスのユーザーが同じタイプの項目を異なるコンテナーで異なる方法でソートしたままにしたい場合がよくあるため、コンテナー クラスは、ユーザーがオプションで独自の比較ファンクターを指定できるようにするオプションのテンプレート引数を取ります。
template <class ItemType, class CompareFunctorType = CompareFunctor<ItemType> > class MyContainer
{
[...]
};
クラス ユーザーがカスタム ファンクター タイプを指定しない場合、デフォルトで次の CompareFunctor 定義が使用されます。
template <typename ItemType> class CompareFunctor
{
public:
bool IsItemLessThan(const ItemType & a, const ItemType & b) const
{
return (a<b); // will compile only for types with < operator
}
};
これは、組み込み型と、より小演算子が定義されているユーザー定義型でうまく機能します。ただし、組み込みまたは明示的に定義された小なり演算子がないタイプでも自動的に機能するようにしたいと思います。これらのタイプの場合、コンテナー内の項目の順序は重要ではありません。
動機は、私がこのコンテナーを使用して多くの異なる型を保持することです。ほとんどの場合、コンテナー内の型の順序は気にしませんが、場合によっては気にします...そして私は気にしません'このコンテナー クラスで使用できるように、これらのさまざまな型すべてに「ダミーの」小なり演算子を追加する必要はありません...そして、カスタムの「ダミー」を明示的に指定する必要はありません。 「より小さい演算子を持たない項目を格納するためにテーブルを使用するたびに、CompareFunctor 引数。
したがって、可能な限りデフォルトの CompareFunctor (上記) が使用されるようにテンプレートの特殊化 (または何か) を使用できる方法はありますが、CompareFunctor がエラーを引き起こす場合、C++ は自動的に「ダミー」にフォールバックします。下のような FallbackCompareFunctor ?それとも、このジレンマを処理するための他の賢い方法はありますか?
template <typename ItemType> class FallbackCompareFunctor
{
public:
bool IsItemLessThan(const ItemType & a, const ItemType & b) const
{
return ((&a)<(&b)); // will compile for all types (useful for types where the ordering is not important)
}
};