传递模板模板参数
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
可能应该提供成员别名以访问 A
、B
和 C
。
当你真正想使用一个类型作为参数时,你不需要模板模板参数(这个类型是否是模板的实例化并不重要)。
翻转您的 CollectionHandler
声明以通过模板专业化剖析 TypeCollection
:
template <class TypeCollection>
class CollectionHandler;
template <class... Types>
class CollectionHandler<TypeCollection<Types...>> { };
假设我们有一个名为 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
可能应该提供成员别名以访问 A
、B
和 C
。
当你真正想使用一个类型作为参数时,你不需要模板模板参数(这个类型是否是模板的实例化并不重要)。
翻转您的 CollectionHandler
声明以通过模板专业化剖析 TypeCollection
:
template <class TypeCollection>
class CollectionHandler;
template <class... Types>
class CollectionHandler<TypeCollection<Types...>> { };