Karma 反復子ベースの API (ここ) は... 出力反復子を受け取ります。
アレイ用に 1 つだけ作成できます。
それに関する問題は、バッファ容量が決して不十分でないことを十分に確認する必要があることです:
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 Iostream には、固定サイズのバッファに対しても安全な、より便利で一般的なアプローチがあります。
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?)