使用模板参数创建模板类型

Posted

技术标签:

【中文标题】使用模板参数创建模板类型【英文标题】:Creating a template type using template parameters 【发布时间】:2016-12-04 22:11:05 【问题描述】:

在这种情况下,我的模板知识有点生疏了。

A类(一个模板类,有两个模板参数T1T2)内部,如何正确声明下面f()方法中使用的函数参数myType

template<typename T1, typename T2>
class A

  void f(T1<T2> myType);
  void g(T2 myType2)

编辑:使用时T2是非模板类型,而T1是模板类型。

原因是我有T2 可以单独使用的用例,没有T1。但是,我仍然想根据T1 定义T2(以明确依赖关系)。

【问题讨论】:

您希望void f(int&lt;char&gt; myType); 做什么?这没有任何意义。 请展示一个简单的预期用例。 您的困惑可能来自您对术语的草率使用。没有“模板类型”之类的东西。有类型,也有模板。类型不是模板,模板也不是类型。类型可能result来自模板(特化),但将模板与其特化区分开来很重要。 同意,我不应该使用模板类型。为更正干杯! 【参考方案1】:

T2 是非模板类型,但 T1 是模板类型

在这种情况下,T1 应该是一个模板模板参数。 它遵循一个最小的工作示例:

template<template<typename> class T1, typename T2>
struct S 
    void f(T1<T2>) 
    void g(T2) 
;

template<typename>
struct T ;

int main() 
    S<T, int> s;
    s.f(T<int>);
    s.g(42);

更多详情请参阅here。


但是,我仍然想根据 T1 定义 T2(以使依赖关系清晰)

如果您想明确依赖关系,还可以使用类似于以下示例中的部分特化来强制执行它:

template<typename>
struct S;

template<template<typename> class T1, typename T2>
struct S<T1<T2>> 
    void f(T1<T2>) 
    void g(T2) 
;

template<typename>
struct T ;

int main() 
    S<T<int>> s;
    s.f(T<int>);
    s.g(42);

【讨论】:

以上是关于使用模板参数创建模板类型的主要内容,如果未能解决你的问题,请参考以下文章

模板之类模板

关于模板

类模板三种类模板参数

类模板参数

C++模板非类型模板参数

模板初步——定义模板