引自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
很容易做到。
这样的设计背后有什么理由吗?
此InputIt first, InputIt last
是一个迭代器范围。它定义了相同类型的元素序列的输入范围。
此Futures&&... futures
是一个可变参数模板。它定义了一系列可能不同类型的参数。
这两者都将其输入值限制为某种形式的未来,但后者可以采用不同类型的期货,从而产生不同类型的价值。vector<T>
是一个均匀的容器;它不能表示不同类型的值(除非它是一个vector<any>
,但这只会使它变得繁琐且使用效率低下(。