小编man*_*ter的帖子

在Boost Spirit中解析嵌套的键值对

我无法使用Boost :: Spirit编写我认为应该是简单解析器的内容.(我使用的是Spirit而不仅仅是使用字符串函数,因为这对我来说是一个学习练习).

数据

要解析的数据采用键值对的形式,其中值本身可以是键值对.键是字母数字(带下划线,没有数字作为第一个字符); 值是字母数字加.-_- 值可以是格式的日期,DD-MMM-YYYY例如01-Jan-2015浮点数,例如3.1415普通的旧字母数字字符串.键和值分开=; 对分开;; 结构化值用{... 分隔}.目前我正在从用户输入中删除所有空格,然后将其传递给Spirit.

输入示例:

Key1 = Value1; Key2 = { NestedKey1=Alan; NestedKey2 = 43.1232; }; Key3 = 15-Jul-1974 ;

然后我会删除所有空格

Key1=Value1;Key2={NestedKey1=Alan;NestedKey2=43.1232;};Key3=15-Jul-1974;

然后我实际将它传递给Spirit.

问题

当价值只是价值时,我现在所拥有的只是花花公子.当我开始在输入中编码结构化值时,Spirit会在第一个结构化值之后停止.如果只有一个结构化值,则解决方法是将其放在输入的末尾...但有时我需要两个或更多结构化值.

代码

以下编译VS2013并说明错误:

#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/pair.hpp>
#include <boost/fusion/adapted.hpp>
#include <map>
#include <string>
#include <iostream>

typedef std::map<std::string, std::string> ARGTYPE;

#define BOOST_SPIRIT_DEBUG

namespace qi = boost::spirit::qi;
namespace fusion = boost::fusion;

template < typename It, typename …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-spirit

5
推荐指数
1
解决办法
702
查看次数

失败的抽象工厂建设的最佳实践

背景

假设我们有一个抽象工厂的实现,调用如下:

std::string ObjectName = "An Object Name";
std::string Args = "Argument passed directly to constructor by the factory";

std::unique_ptr<MyBaseClass> MyPtr(ObjectFactory::Instance().Construct(ObjectName,Args));
Run Code Online (Sandbox Code Playgroud)

工厂使用std::map"An Object Name"成一个构造函数,它本身需要一个std::string作为参数.这个想法是用户比我更了解构造的对象,所以我应该放弃并让用户将他们想要的任何信息传递给构造函数.

Args恰好是预期的形式,但我不知道处理duff输入的最惯用的方式.如果用户提供无效的参数字符串会发生什么?

我能想到以下几点:

  • 让对象的构造函数抛出异常
  • require对象提供了一个bool Validate(std::string x)方法,该方法检查是否x是有效的参数字符串
  • 让工厂使用默认构造函数,然后调用初始化方法(问题:如果init方法失败怎么办?)
  • 设置bool成员变量,如果为true,则表示"此对象不处于理智状态"
  • 我没有想过的其他一些选择

c++ c++11

2
推荐指数
1
解决办法
160
查看次数

标签 统计

c++ ×2

boost ×1

boost-spirit ×1

c++11 ×1