gpt4 book ai didi

c++ - 如何扩展 integer_sequence?

转载 作者:太空狗 更新时间:2023-10-29 21:31:54 24 4
gpt4 key购买 nike

我有一个看起来像这样的函数:

template <typename T, std::size_t... I>
std::ostream& vector_insert(std::ostream& lhs, const char* delim, const T& rhs, std::index_sequence<I...>) {
std::ostream_iterator<float> it(lhs, delim);

((*it++ = at(rhs, I)), ...);
return lhs;
}

这是我最后的尝试,我对 integer_sequence 的扩展仍然失败我希望有人能告诉我如何写一行可以有效扩展为:

*it++ = at(rhs, 0U), *it++ = at(rhs, 1U), *it++ = at(rhs, 2U)

我尝试过的其他事情是:

  1. *it++ = at(rhs, I...)
  2. *it++ = at(rhs, I)...
  3. (*i​​t++ = at(rhs, I))...

他们都给我错误:

error C3520: I: parameter pack must be expanded in this context

我如何扩展这个东西?

编辑:

@AndyG has pointed out这似乎是一个错误。

最佳答案

这似乎是 Visual C++ 的编译器错误。除了简化扩展参数包的表达式之外,我不知道有任何简单的修复方法。转换为递归方法似乎可以可靠地解决该问题。例如:

#include <array>
#include <iostream>
#include <iterator>

template <typename T>
const auto& at(const T& v, size_t i) { return v[i]; }

// End of recursion
template<class T>
void vector_insert_impl(std::ostream_iterator<int> &, const char*, const T&)
{}

// Recursion case
template<class T, std::size_t N, std::size_t... I>
void vector_insert_impl(std::ostream_iterator<int> & iter, const char* delim, const T&rhs)
{
*iter++ = at(rhs, N);

// Continue the recursion
vector_insert_impl<T, I...>(iter, delim, rhs);
}

template <typename T, std::size_t... I>
std::ostream& vector_insert(std::ostream& lhs, const char* delim, const T& rhs, std::index_sequence<I...>)
{
std::ostream_iterator<int> it(lhs, delim);

// Call the recursive implementation instead
vector_insert_impl<T, I...>(it, delim, rhs);

return lhs;
}

int main() {
std::array<int, 5> v = { 1, 2, 3, 4, 5 };
vector_insert(std::cout, " ", v, std::make_index_sequence<v.size()>());
}

这里,参数包 I 仅在提供 VC++ 没有问题的模板参数的上下文中扩展。

关于c++ - 如何扩展 integer_sequence?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56603262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com