问题在于,从 std::vector 中,您不能 -- compile time -- 提取 size() 值。
因此,只有将要从向量中使用的元素数量作为编译时已知值传递给CallDoStuff(),您才能获得所需的内容。
例如,您可以将其作为模板值传递。
使用辅助函数,您可以编写如下内容
template <std::size_t ... Is>
void CallDoStuff (std::vector<int> const & vElements,
std::index_sequence<Is...> const &)
{ DoStuff(vElements[Is]...); }
template <std::size_t N>
void CallDoStuff (std::vector<int> const & vElements)
{ CallDoStuff(vElements, std::make_index_sequence<N>{}); }
电话可能是这样的
CallDoStuff<5u>(v);
如果你可以使用std::array,而不是std::vector,答案就不同了:你可以从类型本身中提取size(),所以
template <std::size_t N, std::size_t ... Is>
void CallDoStuff (std::array<int, N> const & vElements,
std::index_sequence<Is...> const &)
{ DoStuff(vElements[Is]...); }
template <std::size_t N>
void CallDoStuff (std::array<int, N> const & vElements)
{ CallDoStuff(vElements, std::make_index_sequence<N>{}); }
无需解释 N 即可调用,如下所示
std::array<int, 5u> arr { 2, 3, 5, 7, 11 };
CallDoStuff(arr); // no more <5u>
尾注:注意 std::make_index_sequence 和 std::index_sequence 仅从 C++14 开始可用。在 C++11 中,您必须以某种方式替换它们。