为什么 std::when_any 使用 std::tuple 而不是 std::vector 作为其结果类型?



引自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>,但这只会使它变得繁琐且使用效率低下(。

最新更新