私はテンプレートのC++ジェネリックコンテナクラスを作成しています。これは、オプションでその内容を明確な順序で維持することができます。これまでは、関数ポインタを使用してその内容を適切な型固有の方法で並べ替えましたが、代わりにテンプレート関数の引数を使用するように変更しようとしています。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
}
};
これは、ビルトインタイプのための素晴らしい作品と、ユーザー定義型wここではより小さい演算子が定義されています。しかし、組み込み関数がないか、またはより小さい演算子が明示的に定義されている型に対しても、自動的に動作するようにしたいと思います。これらのタイプの場合、コンテナ内のアイテムの順序付けは重要ではありません。
私はこのコンテナを使用してさまざまな種類のものを保持していますが、ほとんどの場合、コンテナ内の型の順序は気にしませんが、場合によっては...私は入って、 "ダミー"以下の演算子をこれらの異なる型すべてに追加するだけでよいので、私はこのコンテナクラスでそれらを使用できるようにする必要はありません。明示的に指定する必要はありません小数点以下の演算子を持たない項目を格納するためにテーブルを使うたびに、カスタムの "ダミー" 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)
}
};
私はそれをしません。比較機能の契約では、ソートされる項目の部分的な順序が定義されています。 * a !(b b = a *のようなプロパティを満たさなければなりません。いくつかのソートアルゴリズムは、 '' return true' "のような矛盾した比較関数が与えられた場合、実際にクラッシュする可能性があります。 –
はい、私のFallbackCompareFunctor exmapleオブジェクトにアイテムのポインタを比較させた理由はJohnさんの懸念です。おそらく、NullCompareは上記の同じことを行うことができますか? –
おっと、返されているはずです。すなわち、すべてが等しい。 –