gpt4 book ai didi

c++ - 搜索/迭代 boost::spirit::qi::symbols

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:22 27 4
gpt4 key购买 nike

如果我有一个符号表:

struct MySymbols : symbols<char, MyEnum::Fruits>
{
MySymbols ()
: symbols<char, MyEnum::Fruits>(std::string("MySymbols"))
{
add("apple", MyEnum::Apple)
("orange", MyEnum::Orange);
}
};

我想遍历表格以便按数据值搜索交易品种。我不能使用 lambda 表达式,所以我实现了一个简单的类:

template<typename T>
struct SymbolSearcher
{
SymbolSearcher::SymbolSearcher(T searchFor)
: _sought(searchFor)
{
// do nothing
}

void operator() (std::basic_string<char> s, T ct)
{
if (_sought == ct)
{
_found = s;
}
}

std::string found() const { return _found; }

private:
T _sought;
std::string _found;
};

我按如下方式使用它:

SymbolSearcher<MyEnum::Fruits> search(ct);
MySymbols symbols;

symbols.for_each(search);
std::string symbolStr = search.found();

如果我在 _found = s 上设置断点,我可以确认 _found 已设置,但是 search.found() 始终返回空字符串。我猜这与在 for_each 中调用仿函数的方式有关,但我不知道。

我做错了什么?

最佳答案

可能是这样

  • 字符串的实际值为空字符串(不太可能)

  • 仿函数按值传递,使有状态仿函数变得无用(因为实际上不会传递原始状态)。

您可以将 _found 字段作为引用(要求您确保遵守三规则以使其工作)。

下面是一个演示,它通过 SymbolSearcher 断言往返结果来展示原理: http://liveworkspace.org/code/4qupWC$1

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

namespace qi = boost::spirit::qi;

template<typename T>
struct SymbolSearcher
{
SymbolSearcher(T searchFor, std::string& result) : _sought(searchFor), _found(result)
{
}

void operator() (std::basic_string<char> s, T ct)
{
if (_sought == ct)
{
_found = s;
}
}

std::string found() const { return _found; }

private:
T _sought;
std::string& _found;
};

int main()
{
const std::string str("mies");

typedef std::string::const_iterator It;
It begin = str.cbegin();
It end = str.cend();

qi::symbols<char, int> symbols;
symbols.add("aap", 1)("noot", 2)("mies", 3);

int out;
bool ok = qi::parse(begin, end, symbols, out);
assert(ok);

std::string found;
SymbolSearcher<int> sf(out, found);
symbols.for_each(sf);

assert(str == sf.found());
}

关于c++ - 搜索/迭代 boost::spirit::qi::symbols,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15099202/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com