Проблема в том, что из std::vector
вы не можете - скомпилировать время - извлечь значение 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 их нужно каким-то образом заменить.