小编Ram*_*mon的帖子

xquery过滤属性和元素

我有以下简单的XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<cars>
    <car>
        <data attrib="Make">
            <text>Volvo</text>
        </data>
        <data attrib="Model">
            <text>855</text>
        </data>
    </car>
    <car>
        <data attrib="Make">
            <text>Volvo</text>
        </data>
        <data attrib="Model">
            <text>745</text>
        </data>
    </car>
    <car>
        <data attrib="Make">
            <text>Volvo</text>
        </data>
        <data attrib="Model">
            <text>V70R</text>
        </data>
    </car>
</cars>
Run Code Online (Sandbox Code Playgroud)

以下XPath:

/cars/car/data[(@attrib='Model') and (text='855')]
Run Code Online (Sandbox Code Playgroud)

这将返回以下结果:

<data attrib="Model"><text>855</text></data>
Run Code Online (Sandbox Code Playgroud)

我希望XPath返回<car>匹配的整个块.

所以返回数据将是这样的:

<cars>
    <car>
        <data attrib="Make">
            <text>Volvo</text>
        </data>
        <data attrib="Model">
            <text>855</text>
        </data>
    </car>
</cars>
Run Code Online (Sandbox Code Playgroud)

我如何修改上面的XPath表达式来实现这一目标?

xpath xquery

8
推荐指数
1
解决办法
2万
查看次数

C++ 逻辑 &amp;&amp; 和 || 的短路求值 运营商

C++ 中的用户重载逻辑运算符 ( &&, ||) 的行为类似于常规函数。也就是说,bool operator&&(const T &a, const T2 &b);在进入函数之前对 in 的两个参数进行求值,因为进入函数是 C++ 中的序列点[1]。到这里一切都很好。

\n\n

现在, \xe2\x80\x9c 内置运算符 && 和 || 执行短路评估\xe2\x80\x9d [2][3],其中左侧和右侧之间有一个序列点。引用的参考文献并没有明确 \xe2\x80\x9cbuiltin\xe2\x80\x9d 是什么,只是它们接受bool操作数,或者使用 \xe2\x80\x9c 上下文转换为 bool\xe2\x80\ 将它们转换x9d。它还提到,只有 \xe2\x80\x9c 两个标准库类重载这些运算符,[因为]短路属性 (...) 不适用于重载,并且因为具有布尔语义的类型并不常见。\xe2\x80\ x9d [2]

\n\n

具有布尔语义的类型?\xe2\x80\x9c 内置运算符\xe2\x80\x9d 到底如何工作?是否根本不可能用短路求值来定义逻辑运算符?

\n\n

[1] https://en.wikipedia.org/wiki/Sequence_point

\n\n

[2] http://en.cppreference.com/w/cpp/language/operator_logic

\n\n

[3] https://en.wikipedia.org/wiki/Short- Circuit_evaluation

\n

c++ operators short-circuiting c++11

3
推荐指数
1
解决办法
1227
查看次数

用于检查是否源自模板专业化的 C++ 概念

这个 SO 答案这个提案中,我们可以看到 的实现(为了方便起见,在下面包含)std::is_specialization_of,它可以检测类型是否是给定模板的特化。

\n
template< class T, template<class...> class Primary >\nstruct is_specialization_of : std::false_type {};\n\ntemplate< template<class...> class Primary, class... Args >\nstruct is_specialization_of< Primary<Args...>, Primary> : std::true_type {};\n
Run Code Online (Sandbox Code Playgroud)\n

该提案明确指出此类型特征不受继承影响:

\n
\n

所提出的特征仅考虑专业化。由于特化与继承无关,因此当任何模板参数恰好通过继承定义时,trait\xe2\x80\x99s 结果不受影响。

\n
\n
template< class > struct B { };\ntemplate< class T > struct D : B<T> { };\n\nstatic_assert(     is_specialization_of_v< B<int>, B> );\nstatic_assert(     is_specialization_of_v< D<int>, D> );\n\nstatic_assert( not is_specialization_of_v< B<int>, D> );\nstatic_assert( not is_specialization_of_v< D<int>, B> );\n
Run Code Online (Sandbox Code Playgroud)\n

有没有一种方法可以实现确实考虑继承的东西,其行为类似于 …

c++ templates c++-concepts

3
推荐指数
1
解决办法
1200
查看次数

返回捕获 lambda 的 lambda 时发出 Clang 警告

以下尝试包装 lambda 的(简化)代码向我提供了一些 Clang 版本的警告,但不是全部,也不是 gcc。

template<typename Lambda>
auto wrapLambda(Lambda lambda)
{
    return [&lambda]() {
        lambda();
    };
}

auto wrappedLambda = wrapLambda([](){ return 0; });
Run Code Online (Sandbox Code Playgroud)
warning: address of stack memory associated with parameter 'lambda' returned [-Wreturn-stack-address]  
    return [&lambda]() {  
             ^~~~~~
Run Code Online (Sandbox Code Playgroud)

这是一个错误,还是我错过了什么?我x86-64 clang (trunk)Godbolt 中收到警告,并clang version 11.1.0作为更大的回购的一部分,但我无法隔离该版本的故障。

这个相关问题中的例子没有给出警告。


改进(我认为)版本:

template<typename Callable>
auto wrapCallable(Callable&& callable)
{
    return [callable = std::forward<Callable>(callable)]() {
        callable();
    };
}

auto wrappedCallable = wrapCallable([](){ return 0; });
Run Code Online (Sandbox Code Playgroud)

这沉默的警告与x86-64 clang (trunk) …

c++ c++11 clang++

0
推荐指数
1
解决办法
70
查看次数