C ++在哪里定义与find_if一起使用的谓词以及如何对它们进行泛化

时间:2015-03-26 09:37:05

标签: c++ algorithm stl predicate

我将从一个例子开始:

ThreadManager.cpp

class ThreadManger{
public:
  ...
private:
  // First predicate
  class MyThreadDereferencedEqual
  {
  public:
    MyThreadDereferencedEqual(const MyThread* toFind) : toFind_(toFind) { }
    bool operator() (const MyThread* other) const { return *toFind_ == *other; }
  private:
    const MyThread* toFind_;
  };

  // Second predicate
  struct MyThreadIsCurrent
  {
    bool operator() (MyThread* theThread) const { return theThread->isCurrentThread(); }
  };

  std::vector<MyThread*>::iterator findThreadHandle(MyThread* threadHandle)
  {
    assert(threadHandle);
    return std::find_if(vThreadHandles_.begin(), vThreadHandles_.end(), MyThreadDereferencedEqual(threadHandle));
  }

  std::vector<MyThread*>::iterator findCurrentThread()
  {
    return std::find_if(vThreadHandles_.begin(), vThreadHandles_.end(), MyThreadIsCurrent());
  }
  ...
}

我应该把这些谓词放在哪里?

  1. 将这些谓词作为嵌套类留在使用它们的管理器中是否可以?
  2. 我应该将它们移到MyThreads吗? (最后,示例中的谓词特定于MyThread,仅使用MyThread指针)
  3. 将它们移动到全局/自定义命名空间?
  4. 对它们进行概括并将它们移到标题中以便重复使用?
  5. 对于数字4)如果我想将这些谓词概括为重用并使它们模板化,我会改变:

    第一个谓词:

    template<typename T>
    class DereferencedEqual
    {
    public:
        DereferencedEqual(const T* toFind) : toFind_(toFind) { }
        bool operator() (const T* other) const { return *toFind_ == *other; }
    private:
        const T* toFind_;
    };
    

    第二个谓词:

    // Have no idea how to make this generic ...
    

0 个答案:

没有答案