【问题标题】:Passing template template parameters传递模板模板参数
【发布时间】:2021-11-24 17:43:54
【问题描述】:

假设我们有一个名为 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 而不必传递类型两次?我尝试使用元组来隐藏参数,但我也无法让它工作。

感谢您的帮助!

【问题讨论】:

  • "我们必须将类型ABC传递两次才能进行模板推导" ?你只通过一次,(CTAD 也可以)。

标签: c++ templates c++17 variadic-templates


【解决方案1】:

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

template <class TypeCollection>
class CollectionHandler;

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

【讨论】:

  • 如果您想在 CollectionHandler 中访问Types...,这是正确的方法。
  • 谢谢,问题解决了!现在看起来很容易,应该早点测试一下
【解决方案2】:

TypeCollecion&lt;A, B, C&gt; 不是模板。它是一种类型。如果你改变了

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

template<typename Collection>
class CollectionHandler {};

然后你可以使用TypeCollecion&lt;A, B, C&gt;作为参数。而TypeCollection 可能应该提供成员别名来访问ABC

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

【讨论】:

  • 是的,成功了,感谢您的帮助!没有我最初想的那么复杂
  • 另外,我将如何检查“Collections”是否实际上是“TypeCollection”类的一种类型?我想过使用 decltype 但这仅适用于实例。
  • @RedNicStone 从这个问题中你真正需要什么并不是很清楚,所以我只提到了最明显的。也许昆汀的答案是你真正想要的,其中CollectionHandler 仅在传递的类型是TypeCollection 的实例化并且可以直接访问它的参数的情况下定义
猜你喜欢
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
相关资源
最近更新 更多