- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
>::type是Pack, Pack > .但“外包装”不-6ren">
ExtractEveryPack<Pack>::type
是 Pack
中所有“叶包”的包.例如,ExtractEveryPack< Pack<double, Pack<int, char>, int, Pack<long, short>> >::type
是Pack< Pack<int, char>, Pack<long, short> >
.但“外包装”不退还。仅提取最内层的包(我称之为“叶包”)。所以
ExtractEveryPack<Pack<Pack<int, double>, char, Pack<long, Pack<Pack<int, char>, Pack<char, Pack<double, int>>>, char>, int, Pack<short, int>>>::type,
是
Pack< Pack<int, double>, Pack<int, char>, Pack<double, int>, Pack<short, int>.
我的想法:ExtractEveryPack<T>::type
是T
默认情况下。然后递归地应用 ExtractEveryPack
对于每种类型并删除所有不是包的类型:
#include <iostream>
template <typename, typename> struct RemoveNonPacksHelper;
template <template <typename...> class P, typename... Accumulated>
struct RemoveNonPacksHelper<P<>, P<Accumulated...>> {
using type = P<Accumulated...>;
};
template <template <typename...> class P, typename First, typename... Rest, typename... Accumulated>
struct RemoveNonPacksHelper<P<First, Rest...>, P<Accumulated...>> : RemoveNonPacksHelper<P<Rest...>, P<Accumulated...>> {};
template <template <typename...> class P, typename... Types, typename... Rest, typename... Accumulated>
struct RemoveNonPacksHelper<P<P<Types...>, Rest...>, P<Accumulated...>> : RemoveNonPacksHelper<P<Rest...>, P<Accumulated..., P<Types...>>> {};
template <typename> struct RemoveNonPacks;
template <template <typename...> class P, typename... Types>
struct RemoveNonPacks<P<Types...>> : RemoveNonPacksHelper<P<Types...>, P<>> {};
template <typename T> struct Identity { using type = T; };
template <typename T>
struct ExtractEveryPack : Identity<T> {}; // Do nothing for non-packs.
// The key idea here, but apparently not correct:
template <template <typename...> class P, typename... Types>
struct ExtractEveryPack<P<Types...>> :
RemoveNonPacks<P<typename ExtractEveryPack<Types>::type...>> {};
// Testing
template <typename...> struct Pack {};
int main() {
std::cout << std::boolalpha << std::is_same<
RemoveNonPacks< Pack<Pack<int, double>, char, Pack<long, double, char>, int, Pack<short, int>> >::type,
Pack<Pack<int, double>, Pack<long, double, char>, Pack<short, int>>
>::value << std::endl; // true
std::cout << std::is_same<
ExtractEveryPack<Pack<Pack<int, double>, char, Pack<long, Pack<Pack<int, char>, Pack<char, Pack<double, int>>>, char>, int, Pack<short, int>>>::type,
Pack< Pack<int, double>, Pack<int, char>, Pack<double, int>, Pack<short, int> >
>::value << std::endl; // false (darn!)
}
这是怎么回事?我的计划或实现呢?什么是更好的计划?
就其值(value)而言,这是一个辅助结构 IsLeafPack
确定一个包是否不包含其他包(已测试),尽管我还没有想出如何使用它:
template <typename> struct IsLeafPack;
template <template <typename...> class P>
struct IsLeafPack<P<>> : std::true_type {};
template <template <typename...> class P, template <typename...> class P2, typename... Types, typename... Rest>
struct IsLeafPack<P<P2<Types...>, Rest...>> : std::false_type {};
template <template <typename...> class P, typename First, typename... Rest>
struct IsLeafPack<P<First, Rest...>> : IsLeafPack<P<Rest...>> {};
最佳答案
递归是正确的。但是应用 ExtractEveryPack
的结果可以是任意数量(包括 0)的叶包。因此,它必须返回一组类型,而不是返回单一类型。然后可以将这些包连接起来以产生最终输出。
// A pack template.
template <typename...> struct Pack {};
// Test if Ts... contains any pack - not necessarily a Pack.
template <typename... Ts>
struct contains_any_pack : std::false_type {};
template <template <typename...> class P, typename... TPs, typename... Ts>
struct contains_any_pack<P<TPs...>, Ts...> : std::true_type {};
template <class F, typename... Ts>
struct contains_any_pack<F, Ts...> : contains_any_pack<Ts...> {};
// concatenates a list of Pack's into one Pack.
template <typename... Ts> struct concat_packs;
template <typename... Ts>
struct concat_packs<Pack<Ts...>> { using type = Pack<Ts...>; };
template <typename... Ts, typename... T1s, typename... T2s>
struct concat_packs<Pack<Ts...>, Pack<T1s...>, T2s... >
: concat_packs<Pack<Ts..., T1s...>, T2s... > {};
// T isn't a pack - return an empty Pack
template <typename T>
struct ExtractEveryPack { using type = Pack<>; };
// if P<Ts...> is a leaf pack, return it wrapped in a Pack.
// else, apply ExtractEveryPack to Ts... recursively,
// and concatenate the results
template <template <typename...> class P, typename... Ts>
struct ExtractEveryPack<P<Ts...>> {
using type = typename std::conditional<contains_any_pack<Ts...>::value,
typename concat_packs<typename ExtractEveryPack<Ts>::type...>::type,
Pack<P<Ts...>>>::type;
};
为了简化实现,上面的 ExtractEveryPack
总是返回叶包的 Pack
。然而,叶子包的类型并不限于 Pack
。
关于c++ - 从一包嵌套包中提取每个 "leaf-pack",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28678768/
我在运行 git gc --prune=now 并得到结果 Counting objects: 100% (619263/619263), done. Delta compression using
我想获取某个类中的所有链接。 HTML 的一个例子是 ES M3 E-mini S&P500 June 2013
我正在 32 位 ARM mcu(Atmel SAM4SD32C,Cortex-M4/ARMv7E-M 部件)上实现二进制日志记录系统,并且正在设计我的数据结构。我的目标是将日志格式描述为一个压缩结构
以下测试代码: [Test] public void PossibleHtmlAgilityPackBug() { const string html = @""; var doc =
如何利用 D3 圆包布局来得到类似这样的图表: (即使有更细长的椭圆)? 这种图表样式的关键应用是更容易放置标签。 这是 jsfiddle这演示了我为其他目的制作的圆包,但我想对于任何想要试验和测试涉
在 C 语言中,编译器将按照声明的顺序排列结构成员,并在成员之间或最后一个成员之后插入可能的填充字节,以确保每个成员都正确对齐。 gcc 提供了一个语言扩展,__attribute__((packed
在 C 语言中,编译器将按照声明的顺序排列结构成员,并在成员之间或最后一个成员之后插入可能的填充字节,以确保每个成员都正确对齐。 gcc 提供了一个语言扩展,__attribute__((packed
在我正在处理的 WPF 应用程序中尝试使用合并的 ResourceDictionaries 解决问题时,我遇到了这个奇怪的问题。 我在外部 DLL(“通用”)中定义了自定义控件(TextButton、
在使用 webpack、webpacker gem 和 Rails 5.1 时,我注意到第一次运行 rspec 会生成 public/packs 和 public/packs-test 。 这些目录是
给定一个 HTML 文档,我想识别文档中的所有数字并在数字周围添加自定义标签。现在,我使用以下内容: HtmlNodeCollection bodyNode = htmlDoc.DocumentNod
我正在尝试使用 #pragma pack (n) 对齐数据成员.以下面为例: #include using namespace std; #pragma pack(8) // or (16) str
我正在尝试让 Html Agility Pack 在我的情况下工作。我需要检测现有 HTML 页面中的所有脚本元素并删除它们,将更改保存到另一个文件。在这里,bodyNode 返回正确数量的脚本标签,
我正在使用 GitLab,需要创建一个 .gitlab-ci.yml 脚本来为生成 nuGet 包的项目运行持续集成管道。 我在寻找可靠的文档来回答这个问题时遇到严重问题: 我应该使用 dotnet
我一直在尝试查找这个问题,但没有找到有效的解决方案。我的编译器忽略了#pragma pack(push) #pragma pack(2) 和 __ attribute __ ((aligned (2)
我正在尝试在 Ubuntu 10.10 上使用 Solaris Studio for Linux。 当我尝试构建以下代码时, const char * 名称 [] = { "苹果", "橙子", "芒
我正在尝试从 HTML 中删除不必要的内容。具体来说,我想删除评论。我找到了一个很好的解决方案( Grabbing meta-tags and comments using HTML Agility
我正在VHDL中的一个项目上工作,我需要从开关中获取4位输入,并根据其他开关的值向右或向左移动一定数量的位,该按钮需要在向右/向左移位之间切换。但是,当我尝试在Xilinx ISE中实现代码时,出现以
我有一台具有 SSH 访问权限的服务器,我想在那里放置一个 Git 源代码库。我刚刚在本地创建了一个 --bare --shared 存储库并将其复制到每个 SCP 的服务器。现在我想根据 SSH u
-moz-box-pack(或 box-pack)的 justify 属性似乎在 Firefox 中被忽略了。 Live example从我们的网站。每行中的数字应该右对齐,它们在 Chrome 中也
这是我的代码。我想知道如何“正确地”读取 BMP 文件,然后在不强制打包结构的情况下读取 header 值。 typedef struct __attribute__((packed)){ uint8
我是一名优秀的程序员,十分优秀!