模板参数演绎,案例不清楚

时间:2015-03-14 17:16:33

标签: c++ templates

class Copier{ };

template<class T>
class Destructor{ };

template<template<class T> class Abstractor>
class BuildFactory : public Abstractor<Copier>{ };

BuildFactory<Destructor> bd;

我无法理解模板参数T将被推导出来的内容。我怀疑T会被推断为Copier,但它只是我的想法,我无法解释。也许有人可以解释这个话题。

3 个答案:

答案 0 :(得分:6)

T不会被推断为任何东西。甚至没有必要。这段代码是等价的:

template<template<class> class Abstractor>
class BuildFactory : public Abstractor<Copier>{ };

这只意味着Abstractor是一个类模板,以及所谓的模板模板参数

通常,可选模板“参数”用于记录应该使用的类模板。

答案 1 :(得分:2)

正如先前的答案所说,这里没有任何演绎。特别是,

  • Abstractor明确指定为Destructor
  • BuildFactory中,Abstractor明确用于Copier的模板参数。
  • BuildFactory<Destructor>中,由于AbstractorDestructor,因此明确使用Destructor<T = Copier>

因为指定了所有模板参数,所以没有推论,甚至没有使用默认参数类型。

答案 2 :(得分:2)

没有扣除。让我们看一下T存在的两个地方:

template<template<class T> class Abstractor>
class BuildFactory : public Abstractor<Copier>{ };

这表示BuildFactory是一个类模板,它本身采用类模板,称之为Abstractor。同样,要明确:Abstractor是一个类模板,而不是实例化。所以根本没有扣除。当您Abstractor<Copier>命名时,班级Copier会有明确的参数。

T实际上没有必要;你可以写:

template<template<class> class Abstractor>
class BuildFactory : public Abstractor<Copier>{ };

现在换另一个代码:

template<class T>
class Destructor{ };

BuildFactory<Destructor> bd;

同样,您传递的是模板Destructor,而不是某些类Destructor<T>。不需要扣除。

此外,无论如何,无法推断出类模板的模板参数。 :P