如何使用 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++ 类成员?的主要内容,如果未能解决你的问题,请参考以下文章