【问题标题】:Does stringstream (or boost) have some smart format feature?stringstream(或 boost)是否有一些智能格式功能?
【发布时间】:2014-10-25 11:29:52
【问题描述】:

我今天写一些业余爱好代码是为了好玩,当我做一些事情时,我想到了一些有趣的事情,我想以一种听起来和看起来不错/很棒/很酷的方式来做。

这个想法基本上是你在 C++ 中有一个字符串,然后你将它传递给一个字符串流(以构造 ss)。

那么,预期的格式是<int or string> <string>,你会根据用户输入得到正确的输出,比如:

bool ExecuteSendPrivateMessage(int sender, std::string params)
{
    std::stringstream sparams(params);
    int_or_string receiverid;
    std::string message;

    sparams >> receiverid >> message;

    if (sparams.fail())
    {
        std::cout << "usage: /send_message_to <userid/username> <message>" << std::endl;
        return true;
    }
    if (int_or_string.HasString())
    {
        receiverid = GetUseridFromUsername(int_or_string.GetString());
    }
    SendMessage(receiverid.GetInt(), message);
    return true;
}

这在 C++ 中可行吗?还是将 C++ 与 Boost 结合使用?

假设没有用户的名字只有数字字符?

【问题讨论】:

  • 您对'smart format' 功能的确切含义是什么?
  • operator &gt;&gt;区分一组可能性并将正确的值分配给正确的变量?就像在示例中一样:)
  • 您可能会关注我在this question 中指出的内容。
  • 您可以使用 Boost Spirit (Qi) 编写包含按特定顺序输入的特定类型的语法。这是员工解析示例:boost.org/doc/libs/1_48_0/libs/spirit/doc/html/spirit/qi/… 对于您示例中的简单情况,这可能是矫枉过正。

标签: c++ formatting iostream sstream


【解决方案1】:

是一种 hacky 方式,但我要做的是将 receiverid 放入 stringstream,然后尝试从 stringstream 读取 int。如果设置了 sstream 的失败标志,那么我们必须有一个字符串,所以我们使用初始接收者 ID。

类似这样的:

std::string recieverid;
std::stringstream srecieverid(recieverid);
int irecieverid;
srecieverid >> irecieverid;
if(srecieverid.fail()) {
   irecieverid = GetUseridFromUsername(recieverid);
}
SendMessage(irecieverid, message);

这并不是最干净的方法,但它确实有效。

【讨论】:

  • 对变量名感到抱歉。
猜你喜欢
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多