gpt4 book ai didi

c++ - 模板问题 : Can compiler deduce template type in static method

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:14 26 4
gpt4 key购买 nike

我有以下设置:

模板类 SpecialModel:

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

一个模板化的 Worker,在某种模型上工作:

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

最后有个类handels通过静态方法给定的 worker ,基本上这个 Manager 类做了很多允许 Worker 管理的东西专注于实际工作:

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 的类型吗?

我为什么要那个?我有一系列 worker ,处理不同种类的特殊模型(不同的 As 和Bs).现在我想遍历这个数组,调用 Manager::getThingsDone(w) on每个 worker 。我应该如何传递类型信息到经理,当只有 worker 阵列时?(SpecialModles 数组在编译时已知(部分此代码的一部分是自动生成的,然后为此进行编译一种特殊的输入),数组将在某处定义然而,在代码的顶层,代码完成了工作应该尽可能通用。不过,我很乐意在不考虑最后一点的情况下找到答案)。

最佳答案

如果 Train 是一个模板类,就像它看起来的那样,编译器无法从静态方法模板参数中推导出模板。

如果 Train::train 是一个静态方法,为什么你的类 Train 是模板化的?方法 train 无论如何都不能访问任何成员变量。你可以让 train 成为一个免费的功能:

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

在你的代码中你可以简单地做

train(w);

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

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

什么是最好的取决于您的具体用例。

关于c++ - 模板问题 : Can compiler deduce template type in static method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1782138/

26 4 0