如何从boost业力生成C ++数组?

时间:2015-09-30 16:32:45

标签: c++ boost boost-spirit-karma

我看到如何使用业力生成一个管理内存的容器,比如 std :: string 。但是预先分配了缓冲区( char [N] )的情况呢?

.top-switch-bg {
    z-index: 99999; //added this
    background-color: #f9f9f9;
}

我想找到一种方法将double解析为现有缓冲区的地址。可以假设缓冲区足够大以适应这种情况。也许底层问题确实存在 - 是否已经有输出迭代器适配器或者可以使用本机数组的业力?

1 个答案:

答案 0 :(得分:4)

基于Karma迭代器的API(here)需要...输出迭代器。

您可以为您创建一个数组。

问题在于你需要非常确定缓冲容量永远不够:

    char buffer[1024];
    char* it = buffer;
    karma::generate(it, karma::double_ << karma::eol, 3.13);

    std::cout.write(buffer, std::distance(buffer, it));

请注意您不能假设缓冲区被NUL终止。使用生成的大小。

安全使用array_sink

Boost Iostreams中有一种更方便,更通用的方法,在面对固定大小的缓冲区时也是安全的:

    char buffer[310];
    io::stream<io::array_sink> as(buffer);
    boost::spirit::ostream_iterator it(as);

这是一个演示特征的现场演示:

<强> Live On Coliru

#include <boost/spirit/include/karma.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>

namespace karma = boost::spirit::karma;
namespace io    = boost::iostreams;

void test(std::vector<int> const& v) 
{
    char buffer[310];
    io::stream<io::array_sink> as(buffer);
    boost::spirit::ostream_iterator it(as);

    using namespace karma;
    if (generate(it, int_ % ", " << eol, v))
    {
        std::cout << "Success: ";
        std::cout.write(buffer, as.tellp());
    } else
        std::cout << "Generation failed (insufficient capacity?)\n";
}

int main() {

    std::cout << "Should be ok: \n";
    std::vector<int> v(100, 1);
    test(v);

    std::cout << "This will exceed buffer capacity: \n";
    std::iota(v.begin(), v.end(), 42);
    test(v);
}

打印

Should be ok: 
Success: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
This will exceed buffer capacity: 
Generation failed (insufficient capacity?)