問題タブ [boost]

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 投票する
25 に答える
19843 参照

c++ - ブーストの最も使用される部分

気づいたときはboost::lexical_cast「なんでもっと早く知らなかったんだろう!」と思いました。- のようなコードを書かなければならないのが嫌だった

今、私は書く

昨日、stackoverflow で、ブースト スプリット (コードを書く手間を省いてくれるもう 1 つの宝石) に出会いました。

私は定期的に使用できる他の機能を探してブーストのドキュメントを調べ始めますが、物事を見逃すのは非常に簡単だと感じています.

最もよく使用する/使用しないと困るブースト機能は何ですか?

0 投票する
17 に答える
52553 参照

c++ - C++ - std::shared_ptr または boost::shared_ptr への参照を渡す

を操作する必要がある関数がある場合、その関数へshared_ptrの参照を渡す方が効率的ではないでしょうか (shared_ptrオブジェクトのコピーを避けるため)。考えられる悪い副作用は何ですか? 次の 2 つのケースが考えられます。

1) 関数内で、次のように引数のコピーが作成されます。

2) 関数内では、次のように引数のみが使用されます。

どちらの場合も、参照ではboost::shared_ptr<foo>なく値で渡す正当な理由がわかりません。値渡しは、コピーのために参照カウントを「一時的に」インクリメントするだけで、関数スコープを終了するときにデクリメントします。私は何かを見落としていますか?

明確にするために、いくつかの回答を読んだ後:私は時期尚早の最適化の懸念に完全に同意し、常に最初にプロファイルしてからホットスポットで作業しようとします. 私の質問は、純粋に技術的なコードの観点からのものでした。

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

c++ - ワイド文字列をブースト日付に変換する

ワイド文字列として保存されている数百万の日付をブースト日付に変換する必要があります

次のコードが機能します。ただし、これは恐ろしいコンパイラ警告を生成し、効率的ではないようです。

より良い方法はありますか?


より良い方法は、ファセットのコレクションである標準 C++ ライブラリlocaleを使用することです。ファセットとは、ストリーム オペレータが日付や時刻の表現などの特定の選択を処理できるようにするサービスです。それぞれが独自の側面で処理される、さまざまなことに関するすべての選択肢が、1 つのロケールにまとめられています。

このソリューションは、litb から指摘されました。litb は、本番コードでファセットを使用するのに十分な助けをしてくれて、コードをより簡潔かつ高速にしました。ありがとう。

ファセットを設計した Nathan Myers によるロケールとファセットに関する優れたチュートリアルがあります。彼はチュートリアルを読みやすくする軽いスタイルを持っていますが、これは高度な内容であり、最初に読んだ後に脳が痛む可能性があります. 今すぐそこに行くことをお勧めします。ワイド文字列をブースト日付に変換する実用性だけを求める人のために、この投稿の残りの部分では、それを機能させるために最低限必要なことについて説明します。


litb は、コンパイラの警告を削除する次の簡単なソリューションを最初に提供しました。(解決策は、私が受け入れる前に編集されました。)これは、ワイド文字を 1 つずつ変換して同じことを行うように見えますが、一時文字列をいじるのを避けるため、はるかに明確だと思います。コンパイラの警告がなくなったことを本当に気に入っています。


litb は、私がこれまで聞いたことのない「ファセット」の使用を提案しました。彼らは、ロケールが設定されているプロローグを犠牲にして、ループ内で信じられないほど簡潔なコードを生成して、仕事をしているようです。

これもより効率的であることが判明しました。

次の出力が生成されます。

OK、これは現在、製品コードに含まれており、回帰テストに合格しています。次のようになります。

これについて最後に 1 つ質問があります。ロケールにファセットを追加するには、ロケール コピー コンストラクターを 2 回呼び出す必要があるようです

add( facet* ) メソッドがないのはなぜですか? ( _Addfac() は複雑で、文書化されておらず、推奨されていません)

0 投票する
10 に答える
4059 参照

c++ - ライブラリのパブリック インターフェイスで boost::shared_ptr を使用する

いくつかの異なるクライアントに提供する C++ ライブラリがあります。最近、パブリック インターフェイスで生のポインターを使用することから、代わりに boost::sharedptr を使用するように切り替えました。ご想像のとおり、これにより、クライアントは誰が何をいつ削除する必要があるかを心配する必要がなくなるという点で、非常に大きなメリットがもたらされました。切り替えを行ったとき、私はそれが正しいことだと信じていましたが、公開インターフェイスにサードパーティのライブラリから何かを含める必要があることに悩まされていました。通常、そのようなことはできれば避けま​​す。私は、boost は事実上 C++ 言語の一部であり、私たちのユース ケースでは、クライアント コードとライブラリの両方がオブジェクトへのポインターを保持する必要があることを合理化しました。しかし最近、クライアントの 1 人から、インターフェイスでニュートラル スマート ポインター クラスを使用するように切り替えることができるかどうか尋ねられました。私たちのライブラリは基本的に特定のバージョンのブーストを強制しているためです。では、どうするのが最善策なのか、今考えています。私はそれについて少し考え、実際のブースト スマート ポインターを単に保持する単純なスマート ポインター クラスを作成することについて疑問に思いました。しかし、クライアントはすぐにそれらの 1 つを自分たちのフレーバーの boost::sharedptr に詰め込み、3 つの共有ポインターの深さになります。これは問題になる場合もあれば、そうでない場合もあります。とにかく、この問題を解決する最善の方法についてコミュニティから意見を聞きたいです。私はそれについて少し考え、実際のブースト スマート ポインターを単に保持する単純なスマート ポインター クラスを作成することについて疑問に思いました。しかし、クライアントはすぐにそれらの 1 つを自分たちのフレーバーの boost::sharedptr に詰め込み、3 つの共有ポインターの深さになります。これは問題になる場合もあれば、そうでない場合もあります。とにかく、この問題を解決する最善の方法についてコミュニティから意見を聞きたいです。私はそれについて少し考え、実際のブースト スマート ポインターを単に保持する単純なスマート ポインター クラスを作成することについて疑問に思いました。しかし、クライアントはすぐにそれらの 1 つを自分たちのフレーバーの boost::sharedptr に詰め込み、3 つの共有ポインターの深さになります。これは問題になる場合もあれば、そうでない場合もあります。とにかく、この問題を解決する最善の方法についてコミュニティから意見を聞きたいです。

編集: 私はもともと所有権の譲渡を言いましたが、API 境界の両側のコードがオブジェクトへのポインターを保持する必要があることを指定する必要がありました。

0 投票する
3 に答える
4883 参照

c++ - 行列テンプレート ライブラリの逆行列

バージョン Boost boost_1_37_0 と MTL mtl4-alpha-1-r6418 でマトリックスを反転しようとしています。マトリックス反転コードが見つからないようです。私は例をグーグルで検索しましたが、上記のリリースでは欠落していると思われる lu.h を参照しているようです。ヒントはありますか?

@Mattは lu.hをコピーすることを提案しましたが、それは MTL4 ではなく MTL2 からのもののようです。VS05 以降の MTL2 でコンパイルできません。

では、MTL4 で行列反転を行う方法はありますか?

更新: Matt のことをよく理解していると思うので、この ITL パスをたどっています。

0 投票する
6 に答える
2460 参照

c++ - shared_ptr:何のために使用されますか

私は自分のコードでboost::scoped_ptrを多用していますが、それは素晴らしいことですが、現在、どこでもshared_ptrを使用するソフトウェアを使用しており、何かが足りないのではないかと思っています。

Shared_ptrは、異なるスレッドが同じデータにアクセスする予定であり、スレッドが終了する順序がわからない場合にのみ役立ちます(shared_ptrを使用すると、最後のスレッドが終了するまでオブジェクトが存在することが保証されます)。

他のユースケースはありますか?

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

c++ - 複数のソースからのマルチキャストの再構成を処理する「いい」方法はありますか?

私は現在、既存のプロプライエタリなソケット ラッパー コードを修正して、boost asio を使用し、重労働の一部を処理できるようにしています。おそらく、既存のコードの中で最も複雑な領域は、マルチキャスト処理コードです。このコードにより、中間層サーバー (1 つのシステムに多数存在する可能性があります) がクライアント ボックスにマルチキャストを送信できるようになり、クライアント ボックスはこれらを使用してシステムのユーザーに更新を提示します。

コードが複雑でエラーが発生しやすい理由は、多くの未加工のバッファを使用して、マルチキャスト ストリームを元の場所に従って再構成するためです。Boost.Asio でも同じ問題に対処する必要があるようです。そのため、行き詰まる前に、他の人がこの状況にどのように対処したかを聞いてみる価値があると思いました。

非常に一般的なユースケースのようです。私が今持っているようなコードなしでこの仕事をするのに役立つものはありますか? または、この種の作業を実行できる確立された C++ テンプレート (Boost またはその他) はありますか?

明らかに、自分で物事を簡単にし、未加工の配列の代わりに STL コンテナーを使用してパケットをバッファーに入れることができますが、このコードは非常に高性能である必要があります。大規模なインストールでは、膨大な数のパケットが飛び交うため、可能な限りリアルタイムに応答する必要があります。

この件についてご意見をお寄せいただきありがとうございます。

ジェイミー

0 投票する
10 に答える
1387 参照

c++ - C++ の複数の整数型クラス

整数を使用して、さまざまな「空間」の値を表すことがよくあります。例えば...

理想的には、これらのタイプ「Index」、「Years」、および「Days」のそれぞれに個別のクラスを用意したいと考えています。これにより、誤ってそれらを混同するのを防ぐことができます。Typedef は文書化の観点からは役立ちますが、タイプセーフとは言えません。

ラッパー クラスを試してみましたが、定型文が多すぎて好みに合わなくなりました。簡単なテンプレート ベースのソリューションはありますか、それとも Boost ですぐに使用できるものはありますか?

編集:何人かの人々が、回答で境界チェックについて話しました。これは便利な副作用かもしれませんが、重要な要件ではありません。特に、範囲外の割り当てだけでなく、「不適切な」タイプ間の割り当ても防止したいと考えています。

0 投票する
3 に答える
1440 参照

c++ - Asio ライブラリでデッドロックを検出するには?

boost::asio ライブラリにはほとんど問題がありません。私のアプリはデータを非同期に受信して処理し、スレッドを作成してそれぞれで io_service.run() を実行します。

何度も、私のアプリケーションは、私のプログラムが生きているかどうかをチェックするいくつかのスーパーバイザーアプリケーションから(Windowsメッセージングシステム全体で)メッセージを受け取ります。アプリケーションが応答しない場合は、再起動されます。ここで注意が必要なのは、スレッドが実行中でデッドロックしていないことを確認することです。次のように、ハンドラーを io_service に投稿できます。

ただし、このメソッドは 1 つのスレッドにのみ影響します。すべてのスレッドが実行中で、デッドロックしていないことを確認するにはどうすればよいですか?

0 投票する
6 に答える
12047 参照

c++ - boost::ptr_vector から要素を消去する方法

したがって、boost::ptr_vector を使用して std::vector を取り除こうとしています。今、要素を要素から削除しようとしており、削除された要素も削除されています。私にとって最も明白なことは、次のことでした。

しかし、これはコンパイルすらできません (完全なエラー メッセージについては以下を参照してください)。std::vector の場合と同じように、消去/削除イディオムを試しましたが、boost::ptr_vector のすべてのアルゴリズムは、std::vector のものとは少し異なることがわかりました。

だから私の質問:

  • ptr_vector からポインターを削除するにはどうすればよいですか?
  • 削除した要素を手動で delete() する必要はありますか?

コンパイラ エラー: