0

我想定义一个用于名称比较的模板仿函数,它接受引用和指针。我想将它用于元素容器上的普通 find_if 以及指针容器(不幸的是 ptr_vector 等不是一个选项)。

到目前为止,我发现的最佳解决方案如下。

template <typename U>
class by_name{
  public:
    by_name(U const& pName):mName(pName) {}

    template <class T>
    typename boost::disable_if_c<boost::is_pointer<T>::value, bool>::type
    operator()(T const& pX){ return pX.getName()== mName;}

    template <class T>
    typename boost::enable_if_c<boost::is_pointer<T>::value, bool>::type
    operator()(T pX){ return pX->getName()== mName;}

private:
    U mName;
};

对于不知道 enable_if 的人来说,这看起来很丑陋而且很难理解。有没有更简单的方法来编写这样一个带有指针和引用的仿函数?

4

2 回答 2

3

它可以很简单:

template <class T>
bool operator()(T const& rX) const { return rX.getName() == mName; }

template <class T>
bool operator()(T* const pX) const { return pX->getName() == mName; }
于 2012-05-11T12:18:05.487 回答
1

实现 getName 成员函数的类是否返回 std::string 以外的任何内容?如果没有,您可以去掉一个模板参数。

这就是我实现仿函数的方式:

class by_name
{
  public:
    by_name(const std::string& name) :
      Name(name) {}

    template <class T>
    bool operator()(T const& pX) const
    {
      return pX.getName() == Name;
    }

    template <class T>
    bool operator()(T* pX) const
    {
      if (!pX)  // how do you handle a null ptr?
        return false;
      (*this)(*pX); // @Luc Danton 
    }

  private:
    std::string Name;
};

如果指针版本实现为

bool operator(T const* pX) const {}

gcc for some reason choose to instantiate

bool operator(T const& pX) const with [T = A*]

The functor has been compiled and tested with gcc 4.6.1.

于 2012-05-12T23:00:09.367 回答