Функтор и шаблоны - PullRequest
       5

Функтор и шаблоны

1 голос
/ 01 февраля 2011

Можно различить, когда параметр шаблона в функторе представляет объект или указатель на объект?

class Comparator
{
    public:

            template <typename Object>
            bool operator() ( const Object &o1, const Object &o2 ) const
            {
                   return ( o1.getID() < o2.getID() );
            }

            template <typename Object>
            bool operator() ( const Object *o1, const Object *o2 ) const
            {
                   return ( o1->getID() < o2->getID() );
            }
};

Объекты или указатели хранятся в универсальном контейнере List, который должен быть отсортирован с использованием класса Comparator

int main()
{
   List <Object *> objects1;
   std::sort(objects1.begin(), objects1.end(), Comparator()); 
   List <Object> objects2;
   std::sort(objects2.begin(), objects2.end(), Comparator());
);

В настоящее время я использую два компаратора (Comparator1, Comparator2), но я не нахожу это удобным ...

Ответы [ 2 ]

4 голосов
/ 01 февраля 2011

Вы можете шаблонизировать сам Comparator:

template<typename Object>
class Comparator {
    public:

        bool operator()(const Object &o1, const Object &o2) const {
            return (o1.getID() < o2.getID());
        }

        bool operator()(const Object *o1, const Object *o2) const {
            return (o1->getID() < o2->getID());
        }
};
int main() {
    std::vector objects1;
    std::sort(objects1.begin(), objects1.end(), Comparator<Object> ());
    std::vector objects2;
    std::sort(objects2.begin(), objects2.end(), Comparator<Object> ());
    return 0;
}

Таким образом, он даже не генерирует два отдельных компаратора!

0 голосов
/ 01 февраля 2011

Учитывая вашу архитектуру (один список Object s, другой Object* s), у вас действительно нет альтернативы.

Вам действительно нужны два списка?

...