У меня есть вектор ввода, который может иметь любой размер между пустым и тремя элементами. Я хочу, чтобы сгенерированная строка всегда была 3 поплавками, разделенными пробелами, где используется значение по умолчанию, если в векторе недостаточно элементов. До сих пор мне удалось вывести только содержимое вектора:Создание значения по умолчанию, когда ни один не найден
#include <iostream>
#include <iterator>
#include <vector>
#include "boost/spirit/include/karma.hpp"
namespace karma = boost::spirit::karma;
namespace phx = boost::phoenix;
typedef std::back_insert_iterator<std::string> BackInsertIt;
int main(int argc, char* argv[])
{
std::vector<float> input;
input.push_back(1.0f);
input.push_back(2.0f);
struct TestGram
: karma::grammar<BackInsertIt, std::vector<float>(), karma::space_type>
{
TestGram() : TestGram::base_type(output)
{
using namespace karma;
floatRule = double_;
output = repeat(3)[ floatRule ];
}
karma::rule<BackInsertIt, std::vector<float>(), karma::space_type> output;
karma::rule<BackInsertIt, float(), karma::space_type> floatRule;
} testGram;
std::string output;
BackInsertIt sink(output);
karma::generate_delimited(sink, testGram, karma::space, input);
std::cout << "Generated: " << output << std::endl;
std::cout << "Press enter to exit" << std::endl;
std::cin.get();
return 0;
}
Я попытался модифицировать правила флоат-то вроде этого: floatRule = double_ | lit(0.0f)
, но только дал мне ошибки компиляции. То же самое для многих других подобных вещей, которые я пробовал.
Я действительно не знаю, как это сделать. Некоторая помощь была бы замечательной :)
EDIT: Просто, чтобы прояснить ситуацию. Если у меня есть вектор, содержащий 2 элемента: 1.0 и 2.0, я хочу сгенерировать строку, которая выглядит так: "1.0 2.0 0.0"
(последнее значение должно быть значением по умолчанию).
Да, это сделал трюк. Большое спасибо :) – Krienie
Я думаю, что придумал что-то более приятное. Тем не менее, я действительно считаю, что ваш тип данных должен быть чем-то вроде 'struct Vec3 {float a, b; факультативно c; }; ' –
sehe
@sehe Я бы предпочел не изменять тип данных из-за контекста, в котором он используется. Если я это сделаю, мне придется изменить почти половину моего конвейера. – Krienie