模板的部分模板专业化

时间:2012-06-19 07:32:32

标签: c++ templates

我不能为我的生活让这个工作。

我有一个现有的模板:

template <class T>
class MyTemplate;

现在我想专门研究它,但对于一个T类是一个模板 - 没有进一步专门化第二个模板,例如:

template <>
template <class T>
class MyTemplate<vector> { /*...*/ };

但是这个以及我尝试过的各种其他语法似乎都没有编译。这是什么语法?或者甚至可能吗?如果没有,MyTemplate是否有可能的替代方案,以便我可以处理vectormap的广义专业化?

5 个答案:

答案 0 :(得分:2)

正确的语法是:

template < typename T>
class MyTemplate<vector<T> > { /*...*/ };

答案 1 :(得分:2)

我认为你正在寻找这个:

template<typename T>
class MyTemplate {...}

template<typename T>
class MyTemplate<vector<T> > {...}

在上面,当您MyTemplate<vector<int> > x;Tint时,会使用部分特化。

答案 2 :(得分:1)

更一般地说

template<typename A, typename B> class MyTemplate;
template<typename C, typename D> class SomeTemplate;

template<typename A, typename C>
class MyTemplate<A, SomeTemplate<C,A> > { /* ... */ };

答案 3 :(得分:0)

模板可以用以下方式定义:

  • 非类型参数(常量)
  • 类型参数
  • 模板参数

一旦定义完毕,任何专业化都必须尊重参数的类型。

因此,如果您想专注于需要类型参数的vector(这是一个模板),您需要拼出vector的参数来创建(模板化)类型参数:

template <typename T, typename Alloc>
class MyTemplate < std::vector<T, Alloc> > {
};

同样适用于map,但有更多参数:

template <typename K, typename V, typename C, typename A>
class MyTemplate < std::map<K, V, C, A> > {
};

然后你去:)

答案 4 :(得分:0)

我不确定为类定义模板的语法。你需要看一下。但是,定义模板并不是全部。您需要为每个模板编写类定义。例如,如果你有一个类定义来讨论x类型的1个参数,并且采用类型为y的2个参数,或者等等......那么你需要一个类来处理它。与函数重载相同。您具有相同的函数名称,但每个都使用不同的参数。你为每个人写了一个函数。并且该调用基于参数列表选择正确的函数。

这样一个类......将通过为每种类型定义来对不同的对象进行排序。