我必须评估决策树。该树有一个模板参数(称为EvalStrategy)。根据策略,节点可能会使此评估失败,并且“救助”。 在这种情况下,必须用更好的stragtegy来调用它。但是之前计算的节点仍然有效。
我的第一个想法是使用嵌套开关:
enum Exbool { TRUE = 0, FALSE = 1, UNDEF = -1 };
template <class STRATEGY>
Exbool evalNode1(args..., ResultCache &Cache);
template <class STRATEGY>
Exbool evalNode2(args..., ResultCache &Cache);
etc
template <class STRATEGY>
Exbool evalTree(args..., ResultCaches &Caches) {
switch(evalNode1<STRATEGY>(args, Cache.Node1)) {
case UNDEF:
return UNDEF;
case TRUE:
switch(EvalNode2<STRATEGY>(args, Cache.Node2)) {
...
}
缓存结构用于存储结果,而使用其他策略调用evalStree可以使用缓存来评估节点。但是它需要使用较弱的策略测试在先前调用中已经测试过的每个节点。不是最佳的。
另一个想法是使用函数调用:
template <class STRATEGY>
Exbool Node0(args...) {
switch(EvalNode1<STRATEGY>(args)) {
case UNDEF:
return UNDEF;
case TRUE;
return Node1<STRATEGY>(args...);
...
}
和
template <class STRATEGY>
Exbool Node1(args...) {
switch(EvalNode2<STRATEGY>(args)) {
...
}
然后,在救助之后,可以在无效的节点上调用它,而无需重新评估所有树。我可以使用指向当前节点的函数指针。 但是我如何用另一种策略调用这个节点?函数指针不适用于模板。