一旦找到所需的替代品,就打破std :: visit

时间:2017-09-02 14:32:40

标签: c++ c++17 variant

我经常发现自己使用以下模式从变体容器中获取所需的变体类型:

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

2 个答案:

答案 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_并停止。

无论如何,我认为你不应该担心:

答案 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;
}