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

时间:2016-12-04 22:11:06

标签: c++

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

在类A(带有2个模板参数T1T2的模板化类)中,如何正确声明{{1}中使用的函数参数myType下面的方法:

f()

修改:使用时,template<typename T1, typename T2> class A { void f(T1<T2> myType); void g(T2 myType2) } 是非模板类型,但T2是模板类型。

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

1 个答案:

答案 0 :(得分:0)

  

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);
}