【问题标题】:Why does std::when_any use std::tuple rather than std::vector as its result type?为什么 std::when_any 使用 std::tuple 而不是 std::vector 作为其结果类型?
【发布时间】:2019-08-11 13:32:22
【问题描述】:

引用自cppref

std::when_any定义如下:

template<class Sequence>
struct when_any_result
{
    std::size_t index;
    Sequence    futures;
};

template<class InputIt>
auto when_any(InputIt first, InputIt last)
    -> future<when_any_result<std::vector<
        typename std::iterator_traits<InputIt>::value_type>>>;

template<class... Futures>
auto when_any(Futures&&... futures)
    -> future<when_any_result<std::tuple<std::decay_t<Futures>...>>>;

让我困惑的是为什么最后一个表单不使用std::vector作为其结果类型?

结果包含一个index 字段,可用于检索准备好的未来。对我来说,std::tuple 在运行时很难通过index 进行迭代,但std::vector 很容易做到。

这样的设计有什么理由吗?

【问题讨论】:

  • “这样的设计有什么理由吗?” - 很可能。没有理由的事情很少会成为标准。

标签: c++ multithreading concurrency standards


【解决方案1】:

这个InputIt first, InputIt last 是一个迭代器范围。它定义了一系列相同类型元素的输入范围。

这个Futures&amp;&amp;... futures 是一个可变参数模板。它定义了一系列可能不同类型的参数。

这两者都将它们的输入值限制为某种形式的未来,但后者可以采用不同类型的未来,从而产生不同类型的值。 vector&lt;T&gt; 是同质容器;它不能表示不同类型的值(除非它是vector&lt;any&gt;,但这只会使其使用起来很麻烦且效率低下)。

【讨论】:

    猜你喜欢
    • 2014-08-31
    • 2019-06-15
    • 2016-06-15
    • 2017-05-22
    • 2011-08-03
    • 2016-11-11
    • 2015-01-07
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多