問題タブ [std-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.

0 投票する
2 に答える
2367 参照

c++ - 現在保持されている std::variant の typeid を取得します (boost::variant type() と同様)

boost::variant から std::variant に移行しましたが、問題が発生しました。

ブースト 'type()' で、現在保持されている typeid を取得できる便利な関数を使用していました。https://www.boost.org/doc/libs/1_48_0/doc/html/boost/variant.html#id1752388-bbを参照してください

これは std::variant でどのように達成できますか?

「type_index」に順序付けられていないマップキーがあり、「std::function」という値を保持しています。私のバリアントは、タイプに応じて、マップから取得して何らかの操作を行う関数を決定します。(私が持っているコードは大きすぎて投稿できません)。

特定の std::variant の特定のビジターを作成する以外に、実装のアイデアはありますか? std::variant で 'index()' 関数を使用して、バリアントの型リストにインデックスを付けることができますか? このようなもの:タプルから N 番目の型を取得する方法は?

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

c++ - バリアントの値への参照を取得するには?

std::variantすべてのクラスが同じベースから派生している場所があります。バリアントをベースにキャストしたい。

これはコンパイルされますが、警告 C4172 が表示されます: ローカル変数または一時のアドレスを返します

std::variantローカルまたは一時的なコピーを作成せずに、その場でアクセスする方法はありますか?

または、それが不可能な場合、値をキャストしてvoid*使用できるようにするにはどうすればよいstatic_castですか?

更新:例は明らかだと思いましたが、そうではありません。完全な再現は次のとおりです。

0 投票する
2 に答える
373 参照

c++ - C++2017 std::vector への参照

std::vectorからなるへの参照を保存しようとしていstd::variantます。const std::variant<T>&a の要素に a を作成できますが、vectorベクトル全体への参照を格納するのに苦労しています。答えは、参照によって保存されたこの投稿 c++ バリアント クラス メンバーに関連していると思いますが、私の状況には適用できません。

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

c++ - enum を含む std::variant で std::visit を使用する方法

可能な型の一部として列挙型を持つ std::variant を使用しようとしています。コンパイル エラーが発生しましたが、原因がわかりません。列挙型の代わりに他の型を使用すると、コードは機能します。ここに私のコードの一部:

ブロックのコメントを外すと、このコードがコンパイルされないのはなぜですか?

*最初の編集*

コードを次のように変更したところ、動作するようになりました。

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

c++ - std::visit の呼び出し内から std::variant の保持型を変更できますか

次のコードは未定義の動作を呼び出しますか?

特に、バリアントに が含まれていない場合、このコードは、以前に保持されていた 型のオブジェクトへの参照を保持したまま、 をA再割り当てします。しかし、代入後は参照が使われなくなっているので、コードは大丈夫だと思います。ただし、標準ライブラリ は、上記が未定義の動作になるような方法で自由に実装できますか?ABstd::visit

0 投票する
2 に答える
490 参照

c++ - テンプレート置換エラーを回避するために std::enable_if で関数をオーバーロードする

1 つは特定のケースをキャッチし、もう 1 つは最初のケースと一致しない他のすべてのケースをキャッチするように、2 つのテンプレート関数を作成したいと考えています。std::enable_if を使用して特定のケースをキャッチしようとしていますが、コンパイラがあいまいな一致で失敗します。あいまいさがコンパイラによって解決されるように、これらのオーバーロードされた関数を作成するにはどうすればよいですか? (私はg ++を使用しています)

次のコードを書いてみました (これは問題を再現する簡単な例です)。

私はコンパイラがすべてのケースを特定のケースに一致させ、他のすべての組み合わせを一般的なケースに一致させることを期待していましたstd::is_same_v<U::resource_t,R>が、コンパイラは関数があいまいであると言って失敗しました。2番目の定義も試し! std::is_sameましたが、コンパイラは失敗しますerror: redefinition of ... callCalcValue()...