gpt4 book ai didi

c++ - boost 表现力!接线员不工作

转载 作者:太空狗 更新时间:2023-10-29 23:47:50 25 4
gpt4 key购买 nike

我刚开始使用 Boost::xpressive 并发现它是一个优秀的库...我浏览了文档并尝试使用 !运算符(零或一),但无法编译 (VS2008)。

我想匹配一个可能以或不以“sip:”开头的 sip 地址

#include <iostream>
#include <boost/xpressive/xpressive.hpp>

using namespace boost::xpressive;
using namespace std;
int main()
{


sregex re = !"sip:" >> *(_w | '.') >> '@' >> *(_w | '.');

smatch what;
for(;;)
{
string input;
cin >> input;

if(regex_match(input, what, re))
{
cout << "match!\n";
}
}

return 0;
}`

最佳答案

您刚刚遇到了一个困扰大多数 DSEL 的错误。

问题是您希望调用一个特定的运算符,该运算符实际上是用您的特定语言定义的。然而,此运算符已存在于 C++ 中,因此适用查找和重载解析的正常规则。

正确运算符的选择是通过 ADL(参数相关查找)完成的,这意味着运算符所应用的至少一个对象应该是 DSEL 本身的一部分。

例如,考虑这个简单的代码片段:

namespace dsel
{
class MyObject;
class MyStream;
MyStream operator<<(std::ostream&, MyObject);
}

int main(int, char*[])
{
std::cout << MyObject() << "other things here";
}

因为表达式是从左到右计算的,dsel::MyObject 的存在是病毒式的,即 dsel 将在这里传播。

关于 Xpressive,大多数时候它之所以有效,是因为您使用了特殊的“标记”,这些标记是 Xpressive 类型的实例,例如 (_w) 或因为病毒效应(例如“@”起作用是因为 >>> 左边的表达式与 Xpressive 相关)。

你是否使用过:

sregex re = "sip:" >> *(_w | '.') >> '@' >> *(_w | '.');
^^^^^^ ~~ ^^^^^^^^^^^
Regular Xpressive

它会起作用,因为由于运算符的优先规则,右侧参数被 Xpressive“污染”了。

但是这里 operator! 具有最高的优先级之一。因此,其范围仅限于:

`!"sip:"`

并且由于 "sip:"char const[5] 类型,它只调用常规的 operator!,这将正确地得出结论它所应用的表达式为 true,因此求值为 boolfalse

通过使用 as_xpr,您可以将 C 字符串转换为 Xpressive 对象,从而从 中引入正确的 operator!考虑到 code>Xpressive 命名空间,并适本地启动重载解析。

关于c++ - boost 表现力!接线员不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3708599/

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