如何使用 boost::tokenizer 作为 C++ 类成员?

Posted

技术标签:

【中文标题】如何使用 boost::tokenizer 作为 C++ 类成员?【英文标题】:How to use boost::tokenizer as a C++ class member? 【发布时间】:2018-03-23 19:44:37 【问题描述】:

我正在用 boost::tokenizer 替换 RWCTokenizer,但我无法编译它,因为代码是当前设计的。这就是它现在基本上在做的事情:

parse.h
    RWCTokenizer*           myTokenizer;

parse.C
function parse::A
    myTokenizer = new RWCTokenizer(myTokenLine);

function parse::B
    token =  ((*myTokenizer)());

function parse::C
    if(myTokenizer == EcDNull)
    
        return ""; // end of tokens
    

所以基本上他们在 A 中设置解析,在 B 中获取标记,并在 C 中检查结尾。

因此我需要在包含中声明迭代器和 tok 变量,以便 A、B 和 C 可以访问它们。但是当我编译时,myTok 说它需要 2 个参数,所以我不知道如何保存该信息。这是我目前尝试做的:

parse.h
    boost::tokenizer< boost::char_separator<char> > myTok;
    boost::tokenizer< boost::char_separator<char> >::iterator myTokenizer2;

parse.C
    function parse::A
    boost::char_separator<char> sep(" ");   // break on white space
    std::string myTokenLine_TMP = myTokenLine.data();
    boost::tokenizer< boost::char_separator<char> > tok(myTokenLine_TMP, sep);
    myTokenizer = tok.begin();
    myTok = tok;

    function parse::B
    RWCString token = *myTokenizer;
    myTokenizer++;

    function parse::C
    if (myTokenizer == myTok.end())
    
        return "";   // end of tokens
    

我在网上看到的唯一示例是 c 主函数中的 boost 代码,其中所有示例与 C++ 类示例相比。我现在唯一能想到的另一件事是在类的顶部声明 boost 的东西是静态的,这是我真的不想做的事情。

如果我可以保存 myTok.end() 部分,我应该能够编译。但我认为我需要保持结构,因为我正在解析的行被传递到 tok(myTokenLine_TMP, sep) 并且当我离开函数时它应该超出范围,因此保存 end() 部分将毫无用处。

那么你如何在 C++ 类中做到这一点?

【问题讨论】:

与常规函数中的完全相同。像创建 int 数据成员一样创建 boost::tokenizer 数据成员。不过,您可能需要重新编写一些代码 如果我知道如何重新编写代码,我会这样做,但无论如何我都看不到这样做。如果您知道如何在包含中声明然后在函数中分配,请发布一个示例,因为无论如何我都看不到使用已发布的文档 boost 已经发布。 【参考方案1】:

要在 C++ 类中执行此操作,您只需使标记器成为您的类的成员,例如

class MyClass

private:
     boost::tokenizer<boost::char_seperator<char>> m_tokenizer;
;

【讨论】:

虽然这将声明它,但您没有设置任何变量,并且除了在构造函数调用中之外没有允许您设置参数的函数,因此这将不起作用。如果您查看“我尝试过的”代码示例,这是我最初尝试过的,我无法将其设置为任何内容。我想我将不得不创建一个我可以分配的助手类,这将使我能够做我想做的事。我将看看我是否可以完成这项工作,如果可以,我会发布一个可行的解决方案。 请问您怎么可能无法对其进行任何设置。我对boost::tokenizer 了解不多,但它仍然是一个常规数据成员,可以被类的所有成员函数访问,所以你的“我试过的”例子应该很好,只要你存储您在某处的 B 函数中获得的令牌,最好是作为类的数据成员。 因为编写类的人并不打算将它用作成员变量。没有赋值运算符,没有在解析时更改模式的选项(如 strtok)或允许在初始构造函数之外设置输入参数的函数。我决定使用 strtok 并创建一个辅助类,使用它来复制我需要它作为成员变量的 Roguewave 标记器类。它的工作,所以我很好。【参考方案2】:

我决定编写一个使用 strtok 与 boost 分词器的帮助类,这将允许我复制 Roguewave 分词器类。

【讨论】:

以上是关于如何使用 boost::tokenizer 作为 C++ 类成员?的主要内容,如果未能解决你的问题,请参考以下文章

Boost::tokenizer 逗号分隔 (c++)

boost::tokenizer 考虑分隔符之间没有标记

Boost.Tokenizer 用于引号和括号

使用具有不同参数的 Boost Tokenizer escaped_list_separator

字符串迭代器不兼容 boost::tokenizer

Qt 等效于 boost tokenizer 表达式/构造