c++ - 非默认构建的 boost::proto 终端

标签 c++ boost boost-proto

我正在尝试使用 boost::proto 定义一个非常有限的解析器组合器库,并且想知道是否可以通过任何方式定义一个非默认构造的原型(prototype)终端。

我有这样的结构:

struct symbol
{
   symbol(const string &str): str_(str) {}
   bool operator()(const string &str) const {
      return (str == str_);
   }

   string str_;
};

我想在 proto 表达式中用作 boost proto 终端。我能够在 BOOST_PROTO_DEFINE_OPERATORS 的帮助下让它工作,但我发现它有点不方便,因为它经常需要将它包装在 proto 内部的 proto::lit() 中表达式:

match(symbol("abc") >> (proto::lit(symbol("xyz")) | symbol("klm")))

我想知道我是否可以像这样创建一个原型(prototype)终端:

proto::terminal<symbol>::type sym;

这将能够以某种方式获取字符串参数并将其传递给符号的构造函数。

注意:我知道 Spirit,但我的编译器不太支持它!

最佳答案

您可以使名称 sym 成为返回终端的函数:

proto::terminal<symbol>::type sym(std::string const& s)
{ return { symbol(s) }; }

很像 lit 是一个将它的参数变成终端的函数模板。

关于c++ - 非默认构建的 boost::proto 终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11909966/

相关文章:

c++ - 用于继承和构造函数的未解析的外部符号 c++

c++ - 为我的程序设置一个 exe 图标

c++ - boost 中的 path::string() 和 path::generic_string() 有什么区别?

c++ - 如何知道要在命令行中链接的库?

C++ boost/multiprecision : fatal error: mpfr. h: 没有那个文件或目录

c++ - 模板化一个简单的 Boost Proto C++ 表达式计算器

c++ - 如何编写由函数模板化的原型(prototype)转换?

c++ - boost最短路径查找算法

c++ - 如何强制在缓存中保留一些内存缓冲区?