C++ “如何获得全部”;“下一步”;链接列表中的节点?生成调用字符串不起作用

C++ “如何获得全部”;“下一步”;链接列表中的节点?生成调用字符串不起作用,c++,string,if-statement,macros,C++,String,If Statement,Macros,所以我有个问题。我的目标是遍历我创建的sigly链表。我想使用std::string作为if语句的参数,如下所示。我知道这不是一个好主意,甚至更糟:我知道这可能是最糟糕的方法。没关系,我想知道是否能做到。 我试着使用宏函数,但要么我做得不对,要么不可能使用这样的宏。请帮帮我。我没有主意了 我在以前的项目中使用了类似的宏,其中我从cmath lib中传递了一个函数名作为参数(用户键入类似于'sin'或'tan'的函数名),以计算给定函数的积分,因此我认为它在这种情况下也可以工作,但显然不行。它说:

所以我有个问题。我的目标是遍历我创建的sigly链表。我想使用std::string作为if语句的参数,如下所示。我知道这不是一个好主意,甚至更糟:我知道这可能是最糟糕的方法。没关系,我想知道是否能做到。 我试着使用宏函数,但要么我做得不对,要么不可能使用这样的宏。请帮帮我。我没有主意了

我在以前的项目中使用了类似的宏,其中我从cmath lib中传递了一个函数名作为参数(用户键入类似于'sin'或'tan'的函数名),以计算给定函数的积分,因此我认为它在这种情况下也可以工作,但显然不行。它说:

类型为“std::string”的条件表达式非法

在第一个while循环中,“at”将是“pHead->pNext”,指向下一个元素。列表中有8个元素,最后一段时间如下:

while(pHead->pNext->pNext->pNext->pNext->pNext->pNext->pNext->pNext)

返回false,“at”将包含指向不存在的第9个元素的“指针”(nullptr)。

C++与matlab或python不同。它不会在运行时编译字符串或代码行。所以不,不能这样使用字符串


通过谷歌搜索“编译器与解释器”查看差异。C++是基于Python的编译器。C++生成程序的用户不需要有所有的构建工具来运行它们。

你想要达到的目的不可能是你请求的方式:

  • C++无法执行运行时创建的“文本”,所有代码必须在编译时可用,因此可以编译成目标机器-机器代码
  • 在运行期间,机器代码不使用符号(变量、类、函数等的名称)(符号转换为地址、寄存器和地址偏移)

实现这一点的最简单方法是:

//@param pHead pointer to first element of the list
void retDispIter(node *pHead)
{
    node* current_node = pHead;

    while (current_node)
    {
        //here send current_node->_value to std::cout

        current_node = current_node->pNext;
    }
}

另一种方法是创建一个非常简单的迭代器类

struct node_iterator
{
    node* current;

    node_iterator operator++()
    {
        node* temp = current;
        current    = current->pNext;
        return node_iterator { temp };
    }

    node_iterator& operator++(int)
    {
        current = current->pNext;
        return *this;
    }

    node*    operator->() const { return current; }
    node&    operator*() const { return *current; }
    explicit operator bool() const { return current != nullptr; }

    bool     operator==(const node_iterator& other) const { return current == other.current; }
    bool     operator!=(const node_iterator& other) const { return !(*this == other); }
};
然后可以这样使用:

//@param pHead pointer to first element of the list
void retDispIter(node* pHead)
{
    node_iterator iter { pHead };

    while (iter)
    {
        // usage
        std::cout << iter->_value;
        std::cout << (*iter)._value;

        // get next 
        ++iter;
    }
}
/@param pHead指向列表第一个元素的指针
无效重新分派器(节点*pHead)
{
节点迭代器iter{pHead};
while(iter)
{
//用法
std::cout_值;

STD::这不仅仅是“不好的主意”。C++根本不这样做。你是想得到某种代码< EVA/EXECUT>类似代码的函数吗?这在C++中是不可能的。你知道这是一个“坏主意”。现在你知道这是不可能的。你说“没关系”。但确实如此。你为什么不告诉我们你真正想要完成什么,我们可以帮助你找到一个好的解决方案呢?遍历链表很简单,没有
eval
。你的问题还不清楚。请用不同的方式解释这个问题。与迭代器类有点相关/重复,谢谢你的迭代器类-我无法取消了解它们是如何工作的,但现在已经清楚多了。请注意,这是一个为您的用例构建的简单迭代器。它不是标准迭代器。
//@param pHead pointer to first element of the list
void retDispIter(node* pHead)
{
    node_iterator iter { pHead };

    while (iter)
    {
        // usage
        std::cout << iter->_value;
        std::cout << (*iter)._value;

        // get next 
        ++iter;
    }
}