C++ 是否有自动递归类型推断或现代方法来实现这一点

C++ 是否有自动递归类型推断或现代方法来实现这一点,c++,C++,我想为解释做一个递归求值树,根据求值结果返回不同的类型,只需几行,并且没有void*,所以这里有一个小的代码示例,说明我试图做的事情,但没有成功 #include <iostream> using namespace std; struct node{ node(string _text){ child = NULL; sibling = NULL; text = _text; } node *child; node *sibling;

我想为解释做一个递归求值树,根据求值结果返回不同的类型,只需几行,并且没有
void*
,所以这里有一个小的代码示例,说明我试图做的事情,但没有成功

#include <iostream>
using namespace std;

struct node{
  node(string _text){
    child = NULL;
    sibling = NULL;
    text = _text;
  }
  node *child;
  node *sibling;
  string text;
};

auto evaluate(node *n){
  if(n->text == "sum"){
    return (int)evaluate(n->child) + (int)evaluate(n->child->sibling);
  }else if(n->text == "lt"){
    return (int)evaluate(n->child) < (int)evaluate(n->child->sibling);
  }else{
    return atoi(n->text.c_str());
  }
}

int main(){
  node sum = node("sum");
  node a_value = node("23");
  node b_value = node("13");
  sum.child = &a_value;
  sum.child->sibling = &b_value;
  cout << (int)evaluate(&sum) << endl;
}
#包括
使用名称空间std;
结构节点{
节点(字符串_文本){
child=NULL;
同级=空;
text=_text;
}
节点*子节点;
节点*兄弟;
字符串文本;
};
自动求值(节点*n){
如果(n->text==“总和”){
返回(int)求值(n->child)+(int)求值(n->child->sibling);
}否则如果(n->text==“lt”){
返回(int)评估(n->child)<(int)评估(n->child->sibling);
}否则{
返回atoi(n->text.c_str());
}
}
int main(){
节点和=节点(“和”);
节点a_值=节点(“23”);
节点b_值=节点(“13”);
sum.child=&a_值;
sum.child->sibling=&b_值;
coutevaluate()有3种情况,其中2种情况返回int值,一种情况返回bool。bool可以隐式转换为int,因此如果evaluate()的返回类型始终为int,则它适用于所有情况:

int evaluate(const node* n)
{
    if (n->text == "sum") {
        return evaluate(n->child) + evaluate(n->child->sibling);
    }
    if (n->text == "lt") {
        return evaluate(n->child) < evaluate(n->child->sibling);
    }
    return atoi(n->text.c_str());
}
int求值(常量节点*n)
{
如果(n->text==“总和”){
返回evaluate(n->child)+evaluate(n->child->sibling);
}
如果(n->text==“lt”){
返回evaluate(n->child)child->sibling);
}
返回atoi(n->text.c_str());
}
C++中的 ,是在编译时确定的。因此它永远不会是运行时变化的解决方案。另一种类型的构造可以是模板,但是它们的类型推导机制也是编译时间。

您需要的是运行时类型确定。这里有两个简单的解决方案:

  • 创建您自己的
    Value
    类,允许组合不同基本类型的值。多态性可以帮助您以优雅和可扩展的方式实现此类型
  • 使用变量,例如
    std::variant
    。变量的值可以是列表中的任何预定义类型。这是一种类型安全联合。不便之处在于,您的计算逻辑需要检查变量的类型以调用正确的操作(因为操作与类型相关,必须在编译时知道)
  • 使用。这与变量非常相似。它更灵活,因为您不需要预定义允许的类型。但从技术上讲,对于您的计算逻辑,您仍然知道为所有可能的类型和正确的操作组合调用的可能类型
无论您的选择是什么,并且与您的主要问题没有直接关系,您可能会感兴趣:

  • evaluate()
    中添加一个附加参数以引用求值上下文(例如,如果表达式还可以包含变量,则为符号表)
  • 在中,它组合并封装
    节点
    evaluate()

sum.child=&a_值;
记住,当
a_值的作用域结束时,节点会消失。是否有任何东西阻止您使用C++的标准模板库(STL)?是否可以使用
std::any
std::variant
?您的问题有点含糊不清。只有在编译器可以在编译时确定返回类型的情况下,才允许使用
auto
作为返回类型。编译器不喜欢使用
auto
返回类型递归调用。因为所有evalu的返回类型ate是
int
,通过显式指定返回类型,代码可以运行。如果这不是您的意图,那么您需要在不使用auto的情况下执行此操作。@Eljay是的,但它需要返回一个变量。因此这不是op想要的,但这是唯一的方法,因为返回类型必须在编译时确定。是的,这是c的妙招,也许我应该发布一些更复杂的东西,我的求值函数也应该返回列表和字符串,所以我不能使用它。