可变参数模板的模板模板参数扩展

2024-05-06

我最近了解到模板模板参数的存在,现在想知道是否可以这样做:

template<template<class... > class Container, typename... args>
struct ContainerTemplate
{
    using container = std::tuple<Container<args...>...>;
};

我想要的是一个模板,它获取 Container 或其他一些模板类作为模板模板参数,然后以这样的方式扩展其余模板参数:如果 Container 有 N 个模板参数,并且我为 args 提供 N * M 模板参数我得到带有 N 个模板参数的 M 个模板实例化,例如:

ContainerTemplate<std::vector, int, short, char>
//assuming std::vector takes only 1 arg for simplicity    

应该导致

container = std::tuple<std::vector<int>, std::vector<short>, std::vector<char>>

while

ContainerTemplate<std::map, int, int, short, short>
//assuming std::map takes only 2 args for simplicity    

应该导致

container = std::tuple<std::map<int, int>, std::map<short, short>>

有什么办法可以做到这一点吗? 问题是您是否可以找出容器需要多少个模板参数。

编辑: 如果要求您以大小为 N 的元组传递附加参数,那就没问题了

ContainerTemplate<std::map, std::tuple<int, int>, std::tuple<short, short>>

编辑2: 所以我实际上找到了一种方法来确定模板模板参数的数量

template<typename... T>
struct TypeList
{
    static const size_t Size = sizeof...(T);
    template<typename T2>
    struct PushFront
    {
        typedef TypeList<T2, T...> type_list;
    };
};

template<template<class...> class Template, typename... Args>
struct SizeofTemplateTemplate
{
    static const size_t Size = 0;
    typedef TypeList<> type;
};

template<template<class...> class Template, typename Arg, typename... Args>
struct SizeofTemplateTemplate<Template, Arg, Args...>
{
    template<typename... Args>
    struct Test;

    typedef char yes[1];
    typedef char no[2];

    template<typename... Args>
    struct Test<TypeList<Args...>>
    {
        template<template<class...> class Template>
        static yes& TestTemplate(Template<Args...>* arg);

        template<template<class...> class Template>
        static no& TestTemplate(...);
    };


    typedef typename SizeofTemplateTemplate<Template, Args...>::type::PushFront<Arg>::type_list type;
    static const size_t Size = sizeof(Test<type>::TestTemplate<Template>(0)) == sizeof(yes) ? type::Size : SizeofTemplateTemplate<Template, Args...>::Size;
};

这样,下面的代码将打印 2

std::cout << SizeofTemplateTemplate<std::vector, int, std::allocator<int>, int, int>::Size << std::endl;

我现在唯一的问题是 dyp 的解决方案使 Visual Studio 编译器崩溃 xD

编辑3: 原始问题的完整解决方案在这里:https://stackoverflow.com/a/22302867/1366591 https://stackoverflow.com/a/22302867/1366591


根据您的第一次尝试,这是不可能的,但根据您的编辑,这是可能的,其中参数包装在std::tuple的。在这种情况下,模板Embed下面的每个参数都带有参数tuple并将它们嵌入Container.

See 活生生的例子 http://coliru.stacked-crooked.com/a/5d2211835eaf1c6e.

template<template<class... > class Container, typename P>
struct Embed_t;

template<template<class... > class Container, typename... T>
struct Embed_t <Container, std::tuple <T...> >
{
    using type = Container <T...>;
};

template<template<class... > class Container, typename P>
using Embed = typename Embed_t <Container, P>::type;

template<template<class... > class Container, typename... P>
struct ContainerTemplate
{
    using container = std::tuple<Embed <Container, P>...>;
};

一般来说,放置... within ...非常棘手,并且只能在有限的情况下发生(我只以有用的方式管理过一次)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可变参数模板的模板模板参数扩展 的相关文章

随机推荐

  • 如果 showPopup 仅适用于 API 11,如何将菜单链接到带有 ABS 的视图?

    注意 PopupMenu 在 API 级别 11 及更高版本中可用 http developer android com guide topics ui menus html PopupMenu http developer android
  • 使用 AngularJS 获取 Youtube 视频标题

    我在使用 AngularJS 获取 YouTube 视频标题时遇到问题 这是我到目前为止的代码 服务 js var myServices angular module myServices ngResource myServices fac
  • 如何启动 EC2 实例并在每个实例上上传/运行启动脚本?

    我想自动启动一组 Linux EC2 实例 基本上 我想编写一个脚本 程序 实例化我的给定 AMI 的 N 次出现 对于每个启动的实例 它会上传自定义脚本并让脚本运行到实例中 使用 VMWare 我通常会使用vmrun或 Vix SDK 亚
  • pygame.sprite.Group() 做什么

    我正在关注有关 pygame 的视频 我看到了这段代码 crosshair pygame sprite Group 有人能给我解释一下吗 阅读以下文档pygame sprite Group https www pygame org docs
  • Excel VBA application.visible 立即设置回 True

    我已经设置了一个新的 空的 无模式的用户表单 用最少的代码来解决我的问题 当工作簿打开时 执行以下代码来隐藏 Excel 并显示用户窗体 这是工作簿的唯一代码 Private Sub Workbook Open UserForm1 Show
  • parse_str 在元素前面加上 & 符号?

    我一直在玩 cURL 并尝试将数组作为 POST 变量发送 我决定使用 http build query 按预期传递字符串 curl setopt this gt ch CURLOPT POSTFIELDS http build query
  • 如何计算PHP中内置函数的总数? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 如何计算
  • 如何从 .Net 中的许多 HTML 文件中读取 xpath 值?

    我的一个文件夹中有大约 5000 个 html 文件 我需要循环遍历它们 打开 使用 xpath 获取 10 个值 关闭并存储在 SQL Server 数据库中 使用 Net 读取 xpath 值的最简单方法是什么 xpath 应该相当稳定
  • 如何通过内存将文件上传到Google Drive [python]

    我一直在论坛上搜索 但没有成功解决我的问题 我正在尝试使用 Google Drive Python API 将内存中的文件上传到 Google Drive 但是 我见过的所有示例都使用磁盘上具有特定文件路径和名称的文件 service bu
  • 在 Ada 中定义通用标量类型包

    我想通过制作一个用于操作多项式的 Ada 包来测试编写 Ada 包的水 可以为多种代数结构定义多项式 因此为了反映这一点 我想使该包通用 以便它可以与浮点数 整数或其他数字子类型一起使用 我现在想说 我对 Ada 的类型系统如何工作或者它的
  • 如何设置 Xcode 来代替 Qt Creator 工作?

    我不使用 Qt Creator 的 UI 设计功能 对于一个新项目 我想体验一下使用 Xcode 的工作 这将是一个常规的 Qt 项目 使用 C 和 Qt 库开发 就像在 Qt Creator 中一样 我没有使用 OS X 尤其是 Xcod
  • 使用 PHP 的 JavaScript atob 操作

    我想知道是否可以使用 PHP 解密 JavaScript 加密文本 使用 JavaScript 的 btoa 函数加密 看一下base64 decode http php net manual en function base64 deco
  • XML声明编码

    它实际上有什么作用 根据我的基本理解 XML 只是一种格式化文本 所以不涉及二进制文本转换 我高度怀疑 UTF 8 和 ASCII 编码之间的唯一区别是 ASCII 编码会将所有非 ASCII 字符转换为 XML 实体 而不是仅保留 XML
  • Jetpack Compose:嵌套导航,在嵌套路径中使用底部栏导航

    我的应用程序具有以下结构 并且由于路线 B 有自己的底部导航栏 因此有自己的 NavHost 我如何从屏幕 C 从选项卡栏打开 导航到路线 A Nested Route onboarding route startDestination s
  • bootstrap-3 在 div 底部对齐链接和按钮

    从下面的屏幕截图中可以看出 链接并未在底部对齐div 如何对齐按钮edit delete add cart在底部div 注意我没有使用table bottomaligned position absolute bottom 0 margin
  • 通用高阶函数

    当我将泛型函数作为本地值传递时 但在作为参数传递时却不能使用具有不同类型参数的泛型函数时 是否有原因 例如 let f id let g x y f x f y g 1 2 工作正常 但如果我尝试将函数作为参数传递 let g f x y
  • Java:不可变类的伪 setter 方法

    假设我有一个 Java 类 Foo 它具有不可变的数据 class Foo final private int x public int getX return this x final private OtherStuff otherst
  • 检查变量是否为空或空字符串的更好方法?

    由于 PHP 是一种动态语言 检查提供的字段是否为空的最佳方法是什么 我想确保 null 被视为空字符串 仅包含空格的字符串被视为空 0 不被视为空 这是我到目前为止所得到的 question trim POST question if q
  • 抛出异常但保留堆栈跟踪

    我想抛出异常 但也带有自定义消息和持久堆栈跟踪 我已经经历了各种线程 catch Exception ex throw Message is read only but stacktrace persist throw ex Message
  • 可变参数模板的模板模板参数扩展

    我最近了解到模板模板参数的存在 现在想知道是否可以这样做 template