传递模板模板参数

Passing template template parameters

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

template<typename ...Types>
class TypeCollection {};

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

template<template<typename ...> class Collection, typename ...Types>
class CollectionHandler {};

将像这样实例化:

CollectionHandler<TypeCollecion, A, B, C>

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

CollectionHandler<TypeCollecion<A, B, C>>

但是我似乎无法让它工作。我尝试了几件事,我意识到你不能将模板化的 class 作为参数传递:

CollectionHandler<TypeCollecion<A, B, C>>  // Error: Template argument for template template parameter must be a class template or type alias template

有没有办法实例化 CollectionHandler 而不必传递类型两次?我尝试用元组来隐藏参数,但我也无法让它工作。

感谢您的帮助!

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

template<template<typename ...> class Collection, typename ...Types>
class CollectionHandler {};

template<typename Collection>
class CollectionHandler {};

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

当你真正想使用一个类型作为参数时,你不需要模板模板参数(这个类型是否是模板的实例化并不重要)。

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

template <class TypeCollection>
class CollectionHandler;

template <class... Types>
class CollectionHandler<TypeCollection<Types...>> { };