【问题标题】: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来自模板(特化),但将模板与其特化区分开来很重要。
  • 同意,我不应该使用模板类型。为更正干杯!

标签: c++


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多