C++ 如何从vector<;生成组合ascii::字符串规则;字符串>;在精神上?

C++ 如何从vector<;生成组合ascii::字符串规则;字符串>;在精神上?,c++,boost,boost-spirit-qi,C++,Boost,Boost Spirit Qi,我想从字符串中搜索特定的字符位置。 特定字符由向量给出。 所以,我想结合来自vector的ascii::字符串规则 我使用了“|=”操作数。但它不起作用 #include <iostream> #include <string> #include <vector> #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix.hpp> #in

我想从字符串中搜索特定的字符位置。 特定字符由向量给出。 所以,我想结合来自vector的ascii::字符串规则

我使用了“|=”操作数。但它不起作用

#include <iostream>
#include <string>
#include <vector>

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>

namespace qi    = boost::spirit::qi;
namespace ascii    = boost::spirit::ascii;

int main()
{
    std::string test = "abc def aaa ffew";
    auto itr = test.begin(), end = test.end();

    std::vector<std::string> find_list = {"des", "ffe", "asaa"};
    std::string result;

    {
        std::string result;
        qi::rule<std::string::iterator, std::string()> rule;
        rule = ascii::string(find_list[0]) | ascii::string(find_list[1]) | ascii::string(find_list[2]);
        // this works
        if (qi::parse(itr, end, (qi::omit[*(qi::char_ - rule)] >> rule), result)) {
            std::cout << result << std::endl;
        } else std::cout << "failed." << std::endl;
    }

    itr = test.begin();

    // Sample that what I want to do
    {
        std::string result;
        qi::rule<std::string::iterator, std::string()> rule;
        for (auto && str : find_list) {
            // this is not equals rule = ascii::string(find_list)[0] | ascii::string(find_list)[1] | .... [n] ??
            rule |= ascii::string(str); 
        }
        // this not works
        if (qi::parse(itr, end, (qi::omit[*(qi::char_ - rule)] >> rule), result)) {
            std::cout << result << std::endl;
        } else std::cout << "failed." << std::endl;

    }

    return 0;
}
我该怎么办?
提前感谢您的帮助。

不要重新发明轮子。Spirit已经为此提供了一个高度优化的解析器:
qi::symbols

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/repository/include/qi_seek.hpp>

namespace qi = boost::spirit::qi;
namespace qr = boost::spirit::repository::qi;

int main() {
    std::string const test = "abc def aaa ffew";

    qi::symbols<char> find_list;
    find_list += "des", "ffe", "asaa";

    std::string result;
    if (qi::parse(test.begin(), test.end(), qr::seek[qi::raw[find_list]], result)) {
        std::cout << result << std::endl;
    } else {
        std::cout << "failed." << std::endl;
    }
}
如果不使用Spirit存储库中的
seek[]
,它会变得更短,但效率更低:

,可能与此相关。
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/repository/include/qi_seek.hpp>

namespace qi = boost::spirit::qi;
namespace qr = boost::spirit::repository::qi;

int main() {
    std::string const test = "abc def aaa ffew";

    qi::symbols<char> find_list;
    find_list += "des", "ffe", "asaa";

    std::string result;
    if (qi::parse(test.begin(), test.end(), qr::seek[qi::raw[find_list]], result)) {
        std::cout << result << std::endl;
    } else {
        std::cout << "failed." << std::endl;
    }
}
ffe