- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个看起来像这样的函数:
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)
我尝试过的其他事情是:
*it++ = at(rhs, I...)
*it++ = at(rhs, I)...
(*it++ = at(rhs, I))...
他们都给我错误:
error C3520:
I
: parameter pack must be expanded in this context
我如何扩展这个东西?
编辑:
最佳答案
这似乎是 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/
我使用下面给出的代码实现了编译时检查以检查是否对某些内容进行了排序: template struct is_sorted { static constexpr bool value = tru
如下直接使用默认参数值生成整数序列会导致硬错误(编译器clang-3.6): #include #include #include template // say M - arity, N -
我有这段代码可以生成 1 到 10 的编译时数组 template // when called below, Is will be 0 - N constexpr std::array make_
我有一个看起来像这样的函数: template std::ostream& vector_insert(std::ostream& lhs, const char* delim, const T&
我想用一个integer_sequence来判断一个范围内的数字是否都在某个值以下:is_range()会返回true,否则返回false,如下所示: #include #include using
如果我理论上有一个整数序列,比如 std::integer_sequence 我如何使用一些编译时谓词过滤它以获得可能更小的 std::integer_sequence ? 为了论证,假设我只想要偶数
给定: typedef std::integer_sequence allowed_args_t; 和: template void foo() { static_assert( /*fire
#include #include using namespace std; template auto map_filter_tuple(F f, T &t) { return mak
我想知道是否有办法转换 std::array成索引序列? constexpr std::array x = {0, 3, 4, 5, 8}; constexpr auto integer_sequen
我基本上使用这个问题作为引用起草了编译时主要检查: Compile time prime checking 我有一个 IsPrime::value 可用。 我想设计一个 find 元函数,它在编译时基
出于教育目的,我尝试创建一个 std::integer_sequence并将其元素汇总为参数包。我希望这很简单,并在下面编写了代码。 第 1 步:创建一组 add() 操作以正确处理同类的、基于整数的
我想找到一个值在 std::integer_sequence 中第一次出现的位置。 标准库中是否有用于此任务的算法? 如果没有,什么是做这件事的好方法? -- 下面是我的尝试。它有效,但我觉得它不是很
如何将 std::integer_sequence 作为模板参数传递给元函数(即不是函数模板)? 给出例如以下用例(但不限于此): 我想使用整数序列从参数包中删除最后的 N 类型。我想我可以使用 th
我为符合以下规则的枚举创建了一个可迭代生成器: 枚举是一个整数序列,没有间隙 给定枚举的最后一个元素不是实际的枚举元素 这个类看起来像这样: template class EnumArrayNonS
我正在尝试创建一个可以用作...的函数 foobar() int main() { auto x = foobar(__func__); // decltype(x) = std::i
所以,我遇到了一段在 GCC 和 MSVC 中表现不同的代码: #include typedef int IType; template struct A; template struct A> {
这个问题在这里已经有了答案: template parameter packs access Nth type and Nth element (5 个回答) 2年前关闭。 我想知道如何访问 std:
考虑一个例子: #include template struct pack { static constexpr std::size_t size = sizeof...(Ts); }; t
也就是说,给定 constexpr std::array{1,2}将它传递给会输出类型 std::integer_sequence 的函数或辅助类? 从类型世界跳转到“constexpr value”
有时我想反转 index_sequence 中的值并使用结果反转某些类似元组的值,就像这个反转中的值的插图编译时的 constexpr std::array。 #include #include
我是一名优秀的程序员,十分优秀!