假设我们有一个名为TypeCollection
的类,它包含以下类型的打包模板:
template<typename ...Types>
class TypeCollection {};
如果我们有一个类模板一个TypeCollection
你需要做这样的事情:
template<template<typename ...> class Collection, typename ...Types>
class CollectionHandler {};
将像这样实例化:
CollectionHandler<TypeCollecion, A, B, C>
这不是很好,因为我们必须传递类型A、B和C两次来进行模板演绎。我的问题是,是否有一种方法可以做到这一点,而不必传递类型两次:
CollectionHandler<TypeCollecion<A, B, C>>
然而,我似乎不能得到这个工作。我尝试了几件事,我意识到你不能传递一个模板类作为参数:
CollectionHandler<TypeCollecion<A, B, C>> // Error: Template argument for template template parameter must be a class template or type alias template
是否有一种方法来实例化CollectionHandler
而不必传递类型两次?我尝试用元组来隐藏参数,但我也不能让它工作。
谢谢你的帮助!
翻转您的CollectionHandler
声明,通过模板专门化剖析TypeCollection
:
template <class TypeCollection>
class CollectionHandler;
template <class... Types>
class CollectionHandler<TypeCollection<Types...>> { };
TypeCollecion<A, B, C>
不是模板。它是一种类型。如果你改变
template<template<typename ...> class Collection, typename ...Types>
class CollectionHandler {};
template<typename Collection>
class CollectionHandler {};
则可以使用TypeCollecion<A, B, C>
作为参数。TypeCollection
应该提供成员别名来访问A
、B
和C
。
当你真正想要使用一个类型作为参数时,你不需要模板模板形参(这个类型是否是模板的实例化并不重要)。