2012-11-26 139 views
2

如何通過find_if函數使用訪問者?我猜我需要做一些類魔法綁定的,所以這是行不通的:boost :: variant和std :: find_if

typedef boost::variant<FileNode,DirectoryNode> Node; 
    typedef std::vector<Node> Nodes; 
    const Nodes& nodes; 
    IsFileNodeVisitor isFileNodeVisitor; 
    find_if (nodes.begin(), nodes.end(), isFileNodeVisitor); 

    class IsFileNodeVisitor: public boost::static_visitor<bool> 
    { 
    public: 
     bool operator()(const FileNode&) const { 
      return true; 
     } 

     bool operator()(const DirectoryNode&) const { 
      return false; 
     } 
    }; 

上面的代碼的想法是給我一個迭代的第一filenode的實例中的節點的載體。

+1

如果你打電話'apply_visitor',它將與正確的類型執行代碼,也沒有重複與您試圖上方。一個可變參數類型只包含一個實例(其中一種類型)。 – Nim

+0

可能你應該指出你正在嘗試的是什麼,在這種情況下'find_if'沒有用(如果它不是我的第一條評論。 ) – Nim

+0

@按要求添加。 – Baz

回答

2

我覺得用boost bind應該工作:

std::find_if (nodes.begin(), nodes.end(), 
       boost::bind(&boost::apply_visitor<IsFileNodeVisitor,Node>, 
          IsFileNodeVisitor(), _1) 
      ); 
相關問題