- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如果我理论上有一个整数序列,比如
std::integer_sequence<int, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>
我如何使用一些编译时谓词过滤它以获得可能更小的 std::integer_sequence<int, ...>
?
为了论证,假设我只想要偶数值,这导致了“我怎样才能使以下 static_assert(或接近的东西)通过?”的问题
static_assert(std::is_same_v<std::integer_sequence<int, 0, 2, 4, 6, 8>,
decltype(FilterEvens(std::integer_sequence<int, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>{}))>,
"Integer sequences should be equal");
这个问题的灵感来自于思考我们如何完成删除两个位集 (this question) 之间的重复项,假设我们可以将位集表示为 integer_sequences
。仅包含 0 和 1。如果您也能以这种方式解决该问题,则可加分
最佳答案
过滤一个序列相当于将一个值序列转换成一个至多一个值的序列序列,然后将它们串联起来。即从<0,1,2,3>
中过滤偶数值与将其转换为序列 <<0>,<>,<2>,<>>
相同并连接产生 <0,2>
.
使用 C++17,这需要非常少的代码。我们将从我们自己的值和序列类型开始(您可以轻松地将 std::integer_sequence
转换为 value_sequence
):
template <auto >
struct value { };
template <auto... Vals>
struct value_sequence { };
我们使用自己的原因是我们可以向其中添加运算符。喜欢+
:
template <auto... As, auto... Bs>
constexpr value_sequence<As..., Bs...> operator+(value_sequence<As...>,
value_sequence<Bs...> )
{
return {};
}
我们将使用它来连接。接下来,我们添加一个函数来将单个值转换为零或一个元素的序列:
template <auto Val, class F>
constexpr auto filter_single(value<Val>, F predicate) {
if constexpr (predicate(Val)) {
return value_sequence<Val>{};
}
else {
return value_sequence<>{};
}
}
最后,我们只需要我们的顶级 filter
把它们放在一起:
template <auto... Vals, class F>
constexpr auto filter(value_sequence<Vals...>, F predicate) {
return (filter_single(value<Vals>{}, predicate) + ...);
}
原始示例中的用法:
constexpr auto evens = filter(
value_sequence<0, 1, 2, 3, 4, 5, 6, 7, 8, 9>{},
[](int i) constexpr { return i%2 == 0; });
C++17 多酷啊!
关于c++ - 如何过滤 std::integer_sequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41723704/
我使用下面给出的代码实现了编译时检查以检查是否对某些内容进行了排序: 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
我是一名优秀的程序员,十分优秀!