模板问题:编译器可以在静态方法中推导出模板类型

时间:2009-11-23 09:53:15

标签: c++ templates

我有以下设置:

模板类SpecialModel:

template<typename A, typename B>
class SpecialModel<A, B> {
};

模仿工人,正在研究某种模型:

template<typename M>
class Worker<M> {

    Worker(M& model);

    void work();
 };

还有SpecialModel的Worker专业化:

template<typename A, typename B>
class Worker<SpecialModel<A, B> > {

    Worker(SpecialModel& model);

    void work();
};

最后,还有一个汉德尔的班级 一个给定的工人通过静态方法, 基本上这个Manager类做了很多 管理事情让工人 专注于实际工作:

template<typename W>
class Manager<W> {

    Manager() {};

    static void getThingsDone(W worker) {
        ...;
        worker.work();
        ...;
    };
};

要获得SpecialModel的'getThingsDone',我需要以下内容 在代码中:

SpecialModel<A1, B1> spmo;
Worker< SpecialModel<A1, B1> > w(spmo);
Manager<Worker< SpecialModel<A1, B1> > >::getThingsDone(w);

最后一行是我遇到的问题。是不是 有一种方法可以说:

Manager::getThingsDone(w); 

编译器不能从w中推断出W的类型吗?

为什么我还想这样呢?我有一系列工人, 从事不同类型的SpecialModel(不同的As和 BS)。现在我想循环遍历这个数组,调用Manager :: getThingsDone(w) 每个工人。我应该如何通过类型信息 在经理,只有工人阵列? (SpecialModles数组在编译时是已知的(部分 此代码是自动生成的,然后为此编译 一种特殊的输入),数组将在某处定义 然而,在代码的顶层,代码正在完成工作 应该尽可能一般。但是,我很乐意 找到答案而不考虑最后一点。)

1 个答案:

答案 0 :(得分:4)

如果Train是模板化的类,那么编译器无法从静态方法模板参数中推断出模板。

如果Train :: train是一种静态方法,为什么你的班级火车是模板化的?方法训练无论如何都无法访问任何成员变量。你可以让火车成为一个自由的功能:

template<class W>
void train(W const& w) { ... }

在您的代码中,您只需执行

即可
train(w);

如果必须使用类型工具模板化类,您可以编写一个可以自动发现模板参数的辅助函数:

template<class W>
Train<W> make_trainer(W const& w) { return Train<W>(w); }

您还可以使用自己的模板参数使train成为Train类的静态函数:

class Train {
   template<class W>
   vod train(W const& w) { ... }
};

然后您的代码可以调用

Train::train(w);

什么是最好的取决于您的确切用例。