- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试将 index_sequence
分成两半。为此,我生成了一个包含下半部分的 index_sequence
,并使用它来跳过完整 index_sequence
中的前导元素。以下是代表我要实现的目标的最小测试用例:
template <int ...I>
struct index_sequence {};
template <int ...I, int ...J>
void foo(index_sequence<I...>, index_sequence<I..., J...>)
{}
int main()
{
foo(index_sequence<0>{}, index_sequence<0, 1>{});
}
我已经用最新版本的 Clang、GCC 和 MSVC 试过了,它们都无法推断出 J ...
。这是标准允许的吗?如果不是,为什么以及什么是实现我的意图的好方法?
最佳答案
如果您想要拆分一个 std::index_sequence
而不是删除两个 std::index_sequence
的公共(public)前缀,我认为您可以从slice
的实现并使用它来将 std::index_sequence
分割成多个部分。
我将省略 std::index_sequence
和 friend 的实现,因为您可以引用论文 N3658 , 和一个示例实现 here .
为了实现slice
,我们将使用一个名为make_integer_range
的助手。我们需要一个 std::index_sequence
生成器,它给我们 [Begin, End) 而不是 [0, End)。利用 std::make_integer_sequence
,我们得到:
template <typename T, typename Seq, T Begin>
struct make_integer_range_impl;
template <typename T, T... Ints, T Begin>
struct make_integer_range_impl<T, std::integer_sequence<T, Ints...>, Begin> {
using type = std::integer_sequence<T, Begin + Ints...>;
};
/* Similar to std::make_integer_sequence<>, except it goes from [Begin, End)
instead of [0, End). */
template <typename T, T Begin, T End>
using make_integer_range = typename make_integer_range_impl<
T, std::make_integer_sequence<T, End - Begin>, Begin>::type;
/* Similar to std::make_index_sequence<>, except it goes from [Begin, End)
instead of [0, End). */
template <std::size_t Begin, std::size_t End>
using make_index_range = make_integer_range<std::size_t, Begin, End>;
由于我们没有 std::index_sequence
的类似 std::get
的功能或可变参数模板包,我们只是构建一个临时的 std::array
让我们 std::get
。然后只用我们想要的切片来分解数组。
template <std::size_t... Indices, std::size_t... I>
constexpr decltype(auto) slice_impl(
std::index_sequence<Indices...>,
std::index_sequence<I...>) {
using Array = std::array<std::size_t, sizeof...(Indices)>;
return std::index_sequence<std::get<I>(Array{{Indices...}})...>();
}
template <std::size_t Begin, std::size_t End, std::size_t... Indices>
constexpr decltype(auto) slice(std::index_sequence<Indices...> idx_seq) {
return slice_impl(idx_seq, make_index_range<Begin, End>());
}
使用我们刚刚构建的 slice
的一个例子是编写一个 split_at
函数。我们指定要拆分 std::index_sequence
的索引,并返回一对在给定索引处拆分的 std::index_sequence
。
template <std::size_t At, std::size_t... Indices>
constexpr decltype(auto) split_at(index_sequence<Indices...> idx_seq) {
return std::make_pair(slice<0, At>(idx_seq),
slice<At, sizeof...(Indices)>(idx_seq));
}
split_at
示例:static_assert(std::is_same<
decltype(split_at<2>(index_sequence<1, 4, 2>())),
std::pair<index_sequence<1, 4>, index_sequence<2>>>(), "");
static_assert(std::is_same<
decltype(split_at<1>(index_sequence<1, 4, 2, 3>())),
std::pair<index_sequence<1>, index_sequence<4, 2, 3>>>(), "");
关于c++ - 拆分 std::index_sequence 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20874388/
#include template> struct index_sequence_of_same_value; template struct index_sequence_of_same_valu
我想创建一个接受以下输入的类: 1,make_tuple('A',2,'B') 在类内部有一个静态类型的元组: std::tuple 和内容: {1,'A',2,'B'} 应该创建。 有点像这样——但
模板参数推导允许以下内容还是未推导的上下文? #include #include template auto make(std::index_sequence = std::make_index_s
我的源代码中有这段代码: template class DimensionPack { public: using Dimensions = std::index_sequence;
所以我偶然发现了这段代码,但我不明白为什么下面的代码构造并非格式错误。 template struct mystruct : std::index_sequence { T i; }; int m
在下面的代码中: #include #include #include template void f(Args... args) { std::cout void g (std::
我是 C++14 std::index_sequence 的新手。结构的 size 成员是什么意思?无论我创建了多少元素,它总是返回一个。 std::integer_sequence::size =
我正在尝试将 index_sequence 分成两半。为此,我生成了一个包含下半部分的 index_sequence,并使用它来跳过完整 index_sequence 中的前导元素。以下是代表我要实现
我想计算 exclusive prefix sum (scan) std::index_sequence 的索引,但我不确定从哪里开始。我调查了 std::make_index_sequence 的实
我很难理解以下内容。为什么这段代码可以编译 template auto foo2(std::index_sequence = std::make_index_sequence()) { co
我有一个 std::tuple,我想使用 std::index_sequence 解包内容以调用可变函数模板 考虑以下示例代码: #include #include template void f
我正在尝试使用 std::integer_sequence及其辅助模板 std::index_sequence初始化一个固定大小的 POD 结构,其行为类似于容器。每个元素又包含一个固定大小的数组字段
我很喜欢使用可变参数模板,并开始尝试使用这个新功能。我试图了解 std::index_sequence 的实现细节(用于元组实现)。我在那里看到了示例代码,但我真的想要一个简单的逐步解释 std::i
我有一个函数模板: template void set_args(const void* p, Us&... args); 我有一个 std::tuple,我想将其解压到 args 中。我目前的解决
我需要用采用相同构造函数参数的 N 个对象初始化一个 std:array,如 std::vector(size_t, {args...}) .从我在这里的搜索中,我想出了这个,它有效: templat
另一个“g++ 和 clang++ 之间谁是正确的?” C++ 标准专家的问题。 给定以下代码 #include template > struct foo; template struct fo
我是一名优秀的程序员,十分优秀!