在 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;

最佳答案

我不知道 C++ 标准库或 Boost 中有任何函数对象这样做(这并不是说没有;我不熟悉 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;

请注意,如果指针指向动态分配的对象并且容器拥有所指向对象的所有权,那么使用原始指针容器是不明智的;这样做不是异常安全的。也就是说,这个谓词适配器应该同样适用于智能指针、迭代器或任何其他支持取消引用的类型。

关于c++ - 取消引用后调用函数的仿函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6269313/

10-11 23:17
查看更多