- 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/
问题:我有一个二叉树,所有叶子都编号(从左到右,从 0 开始)并且它们之间不存在连接。 我想要一种算法,给定两个索引(2 个不同的叶子),从较大的叶子(索引较高的叶子)开始访问树并到达较低的叶子。 树
我需要在 AST 中表示这样的结构: struct { int data; double doubleDataArray[10]; struct { int nestedData;
我有一个自相关表 myTable,如下所示: ID | RefID ---------- 1 | NULL 2 | 1 3 | 2 4 | NULL 5 | 2 6 | 5 7 | 5
我在使用此数据结构模型的类别中有一个表。还使用另一个表向我显示类别分支的路径: **t_category** id | name | parent ------------------ 1 mas
ExtractEveryPack::type是 Pack 中所有“叶包”的包.例如,ExtractEveryPack, int, Pack> >::type是Pack, Pack > .但“外包装”不
我写了下面的代码来构造一个给定顶点的树,给出顶点之间的连接列表。 type Connection = (Int,Int) data Tree = Leaf Int | Node Int [Tree]
我正在尝试识别树中的“叶子”,但我很困惑为什么我的查询没有给我想要的东西。 问题是这样的: 所以我的想法是,只要id不在p_id列中,那么它就应该是“Leaf” select id, 'Leaf' a
我正在尝试识别树中的“叶子”,但我很困惑为什么我的查询没有给我想要的东西。 问题是这样的: 所以我的想法是,只要id不在p_id列中,那么它就应该是“Leaf” select id, 'Leaf' a
我需要做什么来渲染 TreeMap ,使节点向图的叶侧对齐? 我想采用通常看起来像的任意 TreeMap : 并让它类似于: 最佳答案 一种方法是发现树的深度并设置 depth每个没有该值的子节点的节
我从一个几乎空白的项目开始,我可以使用以下方法从 welcome.leaf 渲染一个简单的页面: router.get("view") { req -> Future in let leaf
我正在尝试将骨架模板 View 添加到最近的 Vapor 2 应用程序中,到目前为止,该应用程序仅使用 MySQL 数据库生成 JSON 输出。如果我使用以下最少的代码: get("viewT
题目地址:https://leetcode.com/problems/sum-root-to-leaf-numbers/description/ 题目描述: Given a binary tree
这个查询: SELECT payload.pages FROM FLATTEN([publicdata:samples.github_nested] , payload) ORDER BY creat
我已经在 Fossil SCM 工作了一段时间,但我仍然看到一些我不太明白的东西。 在屏幕截图中,您可以看到我在存储库中有两个叶子,但遗憾的是我找不到将它们合并回主干的方法(在我的所有提交中都有“叶子
给定一棵仅包含 0-9 数字的二叉树,每个根到叶的路径都可以代表一个数字。 一个例子是根到叶的路径 1->2->3 代表数字 123。 找出所有根到叶数的总和 % 1003。 例子: 如果 1 是根节
我使用 vapor 加载 html 或 leaf,它给我错误消息“500”。服务器日志显示给我 [Data File Error: unable to load file at path /Users
我有一个Group、User 和一个App 模型。在我的组模型中,我有一个属性 var apps: [App] 并且我创建了组和用户的兄弟关系。 在我的 WebsiteController 中,我有
我为此编写的代码: sumBST(BST *root) { static sum =0; if (root!= null) {
我想从 jsTree 获取所有叶节点(节点的 ID 和文本)? 我没有使用复选框 ui:jsTree。 Root -----A -----A1
我需要在 Swift Vapor 应用程序中创建一个复杂的 html 表格。 问题是:Leaf 似乎不支持像 #(somevar += 1) 这样的变量计数,也不支持像 #(somevar1 + so
我是一名优秀的程序员,十分优秀!