問題タブ [boost-spirit-karma]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
723 参照

c++ - 自動発電機に関連するブースト精神カルマとブーストバリアントの「概念」

std::vector<boost::variant<..>>他のオブジェクトによって提供される装飾を使用してデシリアライズする必要があります。

「装飾」によって可能になることの 1 つは、ベクター内の空のエントリです。私は実際の実装でレンガの壁にぶつかりました。しかし、私はそれをシュリンクラップすることに成功しました。コンパイルするコード:

必要な概念とともに、「未定義」タイプを実装しようとする問題のある変更。

karma::generateステップをコメントアウトするstd::coutと、有効な式 (Boost::variant OutputStreamable) になります。Spirit では、ジェネレーターにはOutputStreamable(spirit::karma ) である型を指定する必要があり、型をノーオペレーションとして作成したため、OutputStreamable上記のバリアントはそうである必要があります。OutputStreamableundefinedOutputStreamable

何を与える?:(

2 レベル以上のテンプレートの間接化を持つライブラリを使用する場合、C++ のテンプレート メカニズムに価値があるかどうか、私は本当に疑問を持ち始めています。おそらく私はまっすぐに戻る必要があります-c.

編集1:

わかりました、Clangは私に賢明なfirstエラーを与えました...

error: no type named 'properties' in 'boost::spirit::karma::no_auto_mapping_exists'

ここで、undefined を no-op としてマップして、クリーンな変換を行う方法を理解する必要があります。このスピリットのドキュメント エントリ(および具体的にはこれ) は、私が調査する必要があることを説明しています。スピリットによって提供される一般的な未定義のタイプ、またはブーストで定義されたタイプはありますか?そのスピリットはすでに no-op としてマップされていますか?

編集2:

std::vector<boost::optional<boost::variant<..>>>Spirit はそれらに型推論を提供するので、かなり魅力的に見え始めています。

0 投票する
1 に答える
537 参照

c++ - カルマ ジェネレーターで属性のコピーを回避する

カルマを使用して大きな構造体の表現を生成していますが、生成中に構造体がコピーされています。私は彼らがそうである必要はないと思うので、それを避ける方法を考えていました。

以下の簡単な例では、ターゲット構造体が にコピーされるため、"Copy!" が出力されrule::generateます。

foo_ruleの属性を参照によって宣言することで、コピーを停止できます。

しかし、それはベクターでは機能しません [明らかにfoos はコピー可能ですが、ベクター構築時にコピーするのは安価かもしれませんが、生成時にコピーするのは高価です:-)]

以下の例では、'Copy!' が出力されます。生成中に 5 回 (つまり、ベクトル ctor 中のコピーを無視します)。foo_ruleの属性が参照でない場合は 10 回:

両方のルールで参照を取得すると、VC 2008 の Boost 1.47 でコンパイルされません。

と でextract_from_containerインスタンス化されAttribute = std::vector<foo>ますExposed=std::vector<foo> &。extract_from.hpp の 131 行目で、Exposed const &refrence-to-reference を作成するときに、フォームを作成しようとしてコンパイラが失敗します。

私は何かが欠けているように感じるので、どんなポインタでも大歓迎です!

0 投票する
1 に答える
364 参照

c++ - スピリット::カルマを使用して、タプルのベクトルから並べ替えられたタプルを作成します

ルールデータでは(例として)、 doubleの前にintを生成し、それで算術演算を行う必要があります。データルールのセマンティックアクションで合成属性 (タプル) の要素にアクセスするにはどうすればよいですか?

0 投票する
1 に答える
415 参照

c++ - boost :: spirit :: karma::litのセマンティックアクター

一見単純な問題の解決策を見つけてください。コンテナからindex=valueの形式で文字列を生成する必要があります。

例えば:

seq = {10、20、30} output = "1 = 10&2 = 20&3 = 30"

しかし、カスタムgereratorを作成せずに、boost :: spirit::karmaを使用してこれを行う方法は見つかりませんでした。いくつかの理由で、karma::litでセマンティックアクションを使用することは不可能です。多分私は何かを逃したのですか?

コンパイル時に、次のエラーが発生します。

0 投票する
1 に答える
587 参照

c++ - カルマを使用して、ポインターのベクトルの出力を生成します

カルマを使用して、boost::shared_ptrsのベクトルに保持されている構造体の出力を生成するのに問題があります。コンパイルされないintを使用した小さなテストケースがあります。deref_iteratorカスタマイズポイントを使用してこのケースを処理できるか、または、すぐに使用できる精神で、コンテナーがポインター型を保持していることに気づき、追加の逆参照を行うことができると考えていました。とにかくここにテストケースがあります:

コンパイルエラーは次のとおりです。

0 投票する
1 に答える
752 参照

c++ - 条件付きの代替演算子 (|) を使用した boost::spirit::karma

Valueusingという独自のクラスから文字列を生成しようとしていますがboost::spirit::karma、これで行き詰まりました。私の問題を簡単な例に抽出しようとしました。

次のクラスのインスタンスから、カルマを使用して文字列を生成したいと考えています。

ここで、私がやろうとしていることを見ることができます:

karma::generate()値が bool であり、ルールの最初のジェネレーターも bool を「消費」するため、最初の呼び出しは正常に機能します。しかし、カルマが bool を食べようとして、それゆえ を呼び出すため、2 番目karma::generate()は失敗します。boost::bad_getValue::operator bool()

次に考えたのは、ジェネレーター ルールを変更し、ジェネレーターeps()を条件と共に使用することでしたが、ここで行き詰まりました。

eps ジェネレーターの括弧を sth で埋めることができません。このように(もちろん動作しません):

入ってみましたboost::phoenixが、私の脳はこのようなことに対して準備ができていないようです.

私を助けてください!

これが私の完全な例です(コンパイルしていますが動作していません): main.cpp

0 投票する
1 に答える
210 参照

c++ - boost::spirit::karma セマンティック アクション割り当てエラー

セマンティック アクションによってカルマ ジェネレーター値を設定しようとしていますが、コンパイルされません。ドキュメントで説明されているように使用していると確信しているため、理由がわかりません。私はカルマに慣れていないので、初歩的なミスを犯した可能性が最も高い. 最小限の例:

コンパイラ エラーが発生します。

g++ 4.6.3 とブースト 1.48 を使用しています。

0 投票する
1 に答える
1014 参照

c++ - クラス入力に基づいてスピリットカルマの生成を促進する

こんにちは、たとえば、ジェネレーターに渡すものに従ってテキストを生成したいのです

...そして、次のようなものを呼び出します

正しいジェネレーターを使用しているかどうかさえわかりませんが、レイジーは属性にあるものから内部のファンクターを返すものに変換できると言われています

0 投票する
1 に答える
169 参照

c++ - boost::spirit::karma: 代替で no_delimit を使用する

代替演算子 ('|') を含むルールの区切りをオフにしようとしていますが、互換性のない区切り文字に関するコンパイル エラーが発生します。例として、boost の calc2_ast_dump.cpp の例を取り上げ、構造体 dump_ast の ast_node ルールを次のように変更しました。

しかし、これはコンパイルエラーになります:

また、boost/spirit/home/karma/nonterminal/rule.hpp の関連コメント:

私自身のプロジェクトでは、問題なく "no_delimit[a << b]" を実行できます (karma::space 区切り記号を使用)。

代替案について私が見逃しているものはありますか?no_delimit が「<<」では機能するのに、「|」では機能しないのはなぜですか?

ブースト 1.48 を使用していますが、バグ修正が必要でしたか?

0 投票する
1 に答える
381 参照

c++ - ブースト スピリット カルマ 複数のオプション

解決策が表示されないというエラーが表示されます。まず、関連するコード:

そのrange %=部分で、コンパイルエラーが発生します

RangeEntry を ulong_ ルールに一致させようとしていると推測していますが、その理由がわかりません。私は何が欠けていますか?