我有以下设置:
模板类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数组在编译时是已知的(部分 此代码是自动生成的,然后为此编译 一种特殊的输入),数组将在某处定义 然而,在代码的顶层,代码正在完成工作 应该尽可能一般。但是,我很乐意 找到答案而不考虑最后一点。)
答案 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);
什么是最好的取决于您的确切用例。