我经常发现自己使用以下模式从变体容器中获取所需的变体类型:
for(auto&& Variant : variantContainer)
{
// If the variant types match, do something
std::visit([this, &Variant](auto&& arg)
{
using argType = typename std::decay_t<decltype(arg)>; // e.g. `Field<int>`
if (std::holds_alternative<argType>(Variant)) // if the current variant has the same type as the field
{
// do something, then preferably stop checking
// the other possible variants
}
}, Variant);
}
但是,根据std::visit
复杂性的cppreference.com's声明:
如果变体的数量大于1,则调用可调用对象没有复杂性要求。
它可能通常是线性复杂性,所以我想知道是否有任何机制在我得到我需要的东西之后提前摆脱std::visit
?
答案 0 :(得分:2)
我想不出一种方法可以告诉angular.equals(newValue, oldValue);
你希望&#34;突破&#34;,而std::visit
没有明确检查返回值之类的东西。作为一个例子,想象一下std::visit
的自定义版本,它需要一个&#34;特殊的&#34;返回类型:
visit
它的实现将能够检测被调用的struct visitor
{
auto operator()(int, int) { return continue_{}; }
auto operator()(int, float) { return break_{}; }
auto operator()(float, int) { return continue_{}; }
auto operator()(float, float) { return continue_{}; }
};
重载是返回visitor::operator()
还是continue_
并停止。
无论如何,我认为你不应该担心:
break_
通过creating a constexpr
matrix of function pointers and then invoking the matching one实现多变量访问。
libc++
似乎通过generating a multidimensional "vtable"执行类似操作。
答案 1 :(得分:1)
一种方法是通过引用捕获中断标志。
html, body, #app {
height: 100%;
margin: 0;
}
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
display: flex;
flex-direction: column;
}
.wrapper {
flex: 1 0 auto;
}
footer {
background: #ccc;
padding: 20px;
}