我正在编写一个模板化的 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)
}
};