Функтор, который вызывает функцию после разыменования? - PullRequest
4 голосов
/ 07 июня 2011

Есть ли небольшой функтор в стандарте C ++ или в Boost, который оборачивает другой функтор, но разыменовывает указатель, прежде чем он вызовет этот функтор?

Я думаю о чем-то таком:

template<class F>
struct DerefCmp {
  template<class T>
  bool operator()(T* v) const {
    return F(*v);
  }
};

Я бы использовал его в контейнере указателей, например, где я хочу сравнить по значению:

std::set<int*, DerefCmp< std::equal<int> > > s;

Ответы [ 2 ]

3 голосов
/ 07 июня 2011

Я не знаю ни одного функционального объекта в стандартной библиотеке C ++ или в Boost, который бы это делал (это не значит, что его нет; я не знаком с all в библиотеках Boost:-P).

Однако написать свой текст довольно просто.Рассмотрим следующее:

template <typename Predicate>
class indirect_binary_predicate
{
public:
    indirect_binary_predicate(const Predicate& pred = Predicate()) 
        : pred_(pred) 
    {
    }

    template <typename Argument0, typename Argument1>
    bool operator()(Argument0 arg0, Argument1 arg1) const 
    { 
        return pred_(*arg0, *arg1); 
    }

private:
    Predicate pred_;
};

Пример использования:

std::set<int*, indirect_binary_predicate<std::equal_to<int> > > s;

Обратите внимание, что не рекомендуется иметь контейнер необработанных указателей, если указатели предназначены для динамически размещаемых объектов и контейнеравладеет указанными объектами;это не исключение безопасно сделать это.Тем не менее, этот адаптер предикатов должен работать так же хорошо для интеллектуальных указателей, итераторов или любого другого типа, который поддерживает разыменование.

2 голосов
/ 07 июня 2011

Вы можете посмотреть на контейнеры указателя наддува.Они могут использоваться для этой цели со стандартными функторами: Boost.PointerContainer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...