- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这段代码可以生成 1 到 10 的编译时数组
template <int... Is> // when called below, Is will be 0 - N
constexpr std::array<int, sizeof...(Is)>
make_inc_array_impl(std::integer_sequence<int, Is...>) {
return {{(Is + 1)...}}; // +1 to start at one instead of [0, 1, ...]
}
template <std::size_t N>
constexpr std::array<int, N> make_inc_array() {
return make_inc_array_impl(std::make_integer_sequence<int, N>{});
}
constexpr auto a = make_inc_array<10>(); // [1, 2, ..., 10]
int main() {
for(int itr = 0; itr < 10; ++itr)
printf("%d ", a[itr]);
}
嗯,我对元编程的工作原理有一些经验和知识。但我仍然不明白这个惊人的例子是如何真正起作用的。
来自 make_inc_array_impl()
,我看到了,它返回 (Is+1)...
所以结果应该是 [11, 10, 9, 8, 7, ... 2]
自 Is
值从 10
开始?
可变参数模板函数如何make_integer_sequence(parameter pack)
展开/展开 std::integer_sequence<int, Is...>
?在正常的元编程中,模板推导从 N
开始递归工作至 N-1
, 一直到 1
.但这就是为什么它来自 1
的原因至 N
?
能不能帮忙解释一下背后的原理是什么?
最佳答案
调用make_inc_array<10>()
返回 make_inc_array_impl(std::make_integer_sequence<int, 10>{})
. std::make_integer_sequence
是别名模板。特别是,它的实现使得 std::make_integer_sequence<int, 10>
是类型 std::integer_sequence<int, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>
的别名.因此,当 make_inc_array_impl
使用此类型的参数调用,Is...
被推断为 0 1 2 3 4 5 6 7 8 9
为了使参数类型为std::integer_sequence<int, Is...>
等于参数类型。最后,这个包在make_inc_array_impl
的正文中展开.包扩展保证按顺序发生,所以它变成 0 + 1
, 1 + 1
, ..., 9 + 1
.
其中最棘手的部分是 std::make_integer_sequence
.它如何扩展为 std::integer_sequence
专门化所需的实际连续整数?好吧,这已被插入到标准库中,因此您不必自己记住如何做,但如果您想查看答案,请查看 here .
您通常需要一个用 std::make_integer_sequence<int, N>{}
的结果调用的辅助函数这样就有一个地方可以将各个整数放入序列中,即包 Is...
.现在您已经了解了这个技巧,您将开始看到许多可以使用它的地方。
关于c++ - integer_sequence 如何展开以生成序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52323421/
我使用下面给出的代码实现了编译时检查以检查是否对某些内容进行了排序: 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
我是一名优秀的程序员,十分优秀!