빈과 3 개의 요소 사이의 크기를 가질 수있는 입력 벡터가 있습니다. 생성 된 문자열을 항상 공백으로 구분 된 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)
를, 그러나 그것은 단지 나에게 컴파일 오류를 준 지금까지 나는 벡터의 내용 만 출력 관리했습니다. 비슷한 다른 많은 것들에 대해서도 마찬가지입니다.
이 작업을 수행하는 방법을 알지 못합니다. 어떤 도움은 위대한 것입니다 :)
편집 : 그냥 명확하게. 2 개의 요소 (1.0과 2.0)를 포함한 벡터를 가지고 있다면, 다음과 같은 문자열을 생성하고 싶습니다 : "1.0 2.0 0.0"
(마지막 값은 기본값이어야합니다).
예. 고마워요. – Krienie
좀 더 맛있는 것을 생각해 냈습니다. 그러나, 나는 당신의 데이터 타입이 아마도'struct Vec3 {float a, b; 선택 사항 c; }; ' –
sehe
@sehe 데이터 유형을 변경하지 않을 것입니다. 왜냐하면 이것은 사용되는 컨텍스트 때문입니다. 만약 그렇다면, 나는 파이프 라인의 거의 절반을 변경해야합니다. – Krienie