首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递模板模板参数

传递模板模板参数
EN

Stack Overflow用户
提问于 2021-10-04 09:18:30
回答 2查看 89关注 0票数 1

假设我们有一个名为TypeCollection的类,它包含一个打包的类型模板:

代码语言:javascript
复制
template<typename ...Types>
class TypeCollection {};

如果我们有一个模板TypeCollection的类,你需要做一些类似这样的事情:

代码语言:javascript
复制
template<template<typename ...> class Collection, typename ...Types>
class CollectionHandler {};

它将像这样实例化:

代码语言:javascript
复制
CollectionHandler<TypeCollecion, A, B, C>

这不是很好,因为我们必须传递两次类型A、B和C来进行模板推导。我的问题是,是否有一种方法可以在不两次传递类型的情况下做到这一点:

代码语言:javascript
复制
CollectionHandler<TypeCollecion<A, B, C>>

然而,我似乎不能让这个工作。我尝试了几件事,我意识到你不能将模板化的类作为参数传递:

代码语言:javascript
复制
CollectionHandler<TypeCollecion<A, B, C>>  // Error: Template argument for template template parameter must be a class template or type alias template

有没有一种方法可以实例化CollectionHandler而不必两次传递类型?我尝试使用元组来隐藏参数,但是我也不能让它工作。

谢谢你的帮忙!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-04 09:25:14

翻转您的CollectionHandler声明,通过模板专门化剖析TypeCollection

代码语言:javascript
复制
template <class TypeCollection>
class CollectionHandler;

template <class... Types>
class CollectionHandler<TypeCollection<Types...>> { };
票数 5
EN

Stack Overflow用户

发布于 2021-10-04 09:24:41

TypeCollecion<A, B, C>不是模板。它是一种类型。如果你改变了

代码语言:javascript
复制
template<template<typename ...> class Collection, typename ...Types>
class CollectionHandler {};

代码语言:javascript
复制
template<typename Collection>
class CollectionHandler {};

然后,您可以使用TypeCollecion<A, B, C>作为参数。TypeCollection可能应该提供成员别名来访问ABC

当您实际想要使用类型作为参数时,您不需要模板模板参数(此类型是否为模板的实例化并不重要)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69433613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档