問題タブ [boost-variant]
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.
c++ - boost ::variant-「constchar*」が「bool」に変換されるのはなぜですか?
、、およびboost::variant
の3つのタイプを受け入れるを宣言しました。次のコードは、私のバリアントがそれを受け入れてに変換することを示しています。リストにないタイプを受け入れて変換するのは正常な動作ですか?string
bool
int
const char*
bool
boost::variant
出力:
タイプ:その他-> 1
タイプ:文字列->いくつかの文字列
MyVariantからbool型を削除して、次のように変更すると、次のようになります。
const char*
に変換されなくなりましたbool
。今回はに変換されstring
、これが新しい出力です。
タイプ:文字列->いくつかの文字列
タイプ:文字列->いくつかの文字列
これは、variant
他のタイプを最初にに変換しbool
、次にに変換しようとすることを示していstring
ます。型変換が避けられないものであり、常に発生する必要がある場合、変換をstring
より高い優先度にする方法はありますか?
c++ - boost::variant - テンプレート パラメータが const 文字列パラメータよりも優先される理由
次のコードで、理解できない動作が見られます。operator()
ポイントは、次のいずれかのような2 番目のオーバーロードを宣言する場合です。
プログラムの出力は次のとおりです。
ストリング
しかし、次の宣言を使用すると:
出力は次のようになります。
他のタイプ
operator()(const string &other)
後者の場合に呼び出されない理由を誰か説明してもらえますか?
c++ - boost::variantの実装
boost::variant
の実装に興味があります。
このように動作しますか?
2人のメンバー:
- 現在保存されているタイプを表す数値(つまり、最初のテンプレートパラメーターの場合は0、2番目のテンプレートパラメーターの場合は1など)
- 可能なすべてのタイプの和集合(もちろん最大のサイズ)。
apply_visitor()
:
正しいswitch
オーバーロードを呼び出すために、現在格納されているタイプを表す数値に関するステートメントがあります(これは、最悪の場合、ジャンプテーブルとしてコンパイルされるため、一定の時間がかかります)。
ここboost::variant
で詳しく説明するように、メモリを動的に割り当てる必要がない最適化もいくつかあることは理解していますが、私はこれらを取得したと思います。
c++ - なぜブースト::バリアントのstd::vectorがブーストスピリットの構文解析の問題を引き起こしているのですか?
この以前の投稿を拡張して、私std::vector<boost::variant<double,std::string>>
は単にではなくキャプチャしようと思いましたboost::variant<double,std::string>
が、最初に同じ古い入力から始めます。
入力'foo'と42.7が与えられた場合の出力は次のとおりです。
私が理解していない何らかの理由で、パーサーは「foo」のASCII値を生成していて、混乱を引き起こしているようです。
DO_VECTORをオンにするときにパーサーを変更する必要がありますか?
別のコンテナを使用する必要がありますか?
コード
c++ - バリアント タイプの識別
特定の型を特定し、 boost::variant
それをクラスオブジェクト内のメンバー関数引数として渡すことで、次の問題を混乱させています。次のコードを検討してください
クラステスト内に訪問クラス/構造(apply_visitor)を実装することを確信しました。しかし、ビジター クラスに実装されているオーバーロードされた演算子から func3(string s) という外部メンバー関数を呼び出すことで行き詰まりました。
c++ - 他のクラス内での訪問クラスの実装
関連するメンバー関数を実行するために、クラスオブジェクト内のboost::variantのタイプを識別しようとしています。次のコードを検討してください。
問題は、同じオブジェクト内のそのデータ型EVENに関連するメンバー関数を呼び出すために、メンバー関数内のバリアントのタイプを識別する必要があることです。
c++ - boost::variant 派生クラスを実装する方法は?
から派生したクラスをコーディングするために何時間も試みましたboost::variant
。しかし、何が問題なのかわかりません (コンパイル エラーの意味がわかりません)。
boost::variant
クリーンな派生クラスを実装するためのルールは何ですか?
継承を使用する理由 (@zaufiに詳細を提供するために編集)
- 空の状態が欲しい
const char*
として受け入れたいstring
int
として受け入れたいlong
enum
タイプをあげたい
たとえば、疑似 C++ コードでは、次のことを期待しています。
(質問の上にある)基本的なスニペットコードは、さまざまなプラットフォームでテストされています
- ブースト v1.33 + GCC 4.1 (Linux)
- ブースト v1.52 + GCC 4.7 (MinGW)
- ブースト v1.52 + Visual C++ 2010 (v10)
GCC の 2 つのバージョンのエラーの下に (誰かが気になる場合は、両方のいずれかを削除できます...)
c++ - boost::spirit の使用中に boost::variant の boost::fusion 構造体を変換できない
良い時間です!
私はこのコードを書き、コンパイルできることを期待しています。
しかし、clang または GCC でコンパイルすると、エラーが発生します。その中で最も興味深い部分は次のとおりです。
私はclang 3.1またはgcc 4.7とboost 1.52を使用していますが、それは問題ではないと思います。:)
このコードをコンパイルするには、どのように編集すればよいですか?
アップデート
指定した文法が左再帰であるため、入力の処理中に再帰下降パーサーが停止しない場合があることに気付きました。これがコンパイルの問題の原因でしょうか?
c++ - ブースト プロパティ ツリーにデータを追加する
XML に格納された単純なツリー構造がboost::property_tree::ptree
あり、情報を読み取って抽出するために使用します。std::maps
次に、葉にデータを格納できるように、 を使用してツリーを再作成します。これはうまく機能し、データから固定ツリー構造を分離するのが好きですが、多くのコードを複製していると感じており、ptree の各リーフ ノードにクラスを追加できれば、コードを大幅に簡素化できると思います。
少し複雑になる可能性があるboost::variant
ため、葉に保存したいクラスで使用しています。
私の主な質問は、動的データを ptree に追加しようとすべきかということです。次に、そうであれば、それを追加する最良の方法について何か提案はありますか。
c++ - 無関係なタイプで動的ポリモーフィズム(実行時コールディスパッチ)を実現するにはどうすればよいですか?
ゴール:
無関係な型、つまり共通の基本クラスを持たない型で、型セーフな動的ポリモーフィズム(つまり、関数呼び出しの実行時ディスパッチ)を実現したいと思います。これは達成可能であるか、少なくとも理論的には健全であるように思われます。私は自分の問題をより正式に定義しようとします。
問題の定義:
次の場合:
- 2つ以上の無関係な型
A1, ..., An
。それぞれに、と呼ばれるメソッドがf
あり、署名が異なる可能性がありますが、戻り型は同じR
です。と boost::variant<A1*, ..., An*>
オブジェクト(または他のv
タイプのバリアント)。これらのタイプのいずれかの値をいつでも想定でき、想定する必要があります。
私の目標は、に含まれる値の実際のタイプがである場合に機能するように実行時にディスパッチさv.f(arg_1, ..., arg_m);
れるものと概念的に同等の命令を作成することです。呼び出し引数が各関数の仮パラメーターと互換性がない場合、コンパイラーはエラーを発生させる必要があります。Ai::f
v
Ai
Ai
もちろん、構文に固執する必要はありません。v.f(arg_1, ..., arg_m)
たとえば、のようなものcall(v, f, ...)
も受け入れられます。
私はこれをC++で達成しようとしましたが、これまでのところ、良い解決策を思い付くことができませんでした(私にはたくさんの悪い解決策があります)。以下に、「良い解決策」の意味を明確にします。
制約:
良い解決策は、v.f(...)
イディオムを模倣できるもの、たとえばcall_on_variant(v, f, ...);
、次の制約を満たすものです。
- この方法で呼び出す必要のある関数ごとに(たとえば)、またはコード内の別の場所、特にグローバルスコープで多態的に処理できる(たとえば)無関係な型のリストに対して、個別の宣言を行う必要はありません。
f
ENABLE_CALL_ON_VARIANT(f)
A1, ..., An
ENABLE_VARIANT_CALL(A1, ..., An)
- 呼び出しを行うときに、入力引数のタイプに明示的に名前を付ける必要はありません(例
call_on_variant<int, double, string>(v, f, ...)
)。リターンタイプの命名はOKなので、たとえばcall_on_variant<void>(v, f, ...)
受け入れられます。
うまくいけば私の願いと要件を明確にする実証的な例に従います。
例:
このプログラムの出力は次のようになりますABC
。
最良の(失敗した)試み:
目的のソリューションに最も近いのは、次のマクロです。
テンプレートメンバーのみがローカルクラスで許可されている場合、これは完全に機能します(この質問を参照)。誰かがこれを修正する方法、または別のアプローチを提案する方法を知っていますか?