タグ付けされた質問 「c++11」

このタグは、C ++ 11としてコンパイルする必要があるコードに使用します(C ++ 14以降で導入された機能は使用しません)。

5
externテンプレートの使用(C ++ 11)
図1: 関数テンプレート TemplHeader.h template<typename T> void f(); TemplCpp.cpp template<typename T> void f(){ //... } //explicit instantation template void f<T>(); Main.cpp #include "TemplHeader.h" extern template void f<T>(); //is this correct? int main() { f<char>(); return 0; } これはを使用する正しい方法ですかextern template、またはこのキーワードを図2のようにクラステンプレートにのみ使用しますか? 図2:クラステンプレート TemplHeader.h template<typename T> class foo { T f(); }; TemplCpp.cpp template<typename …
116 c++  templates  c++11  extern 

4
forループ内のifステートメントを回避しますか?
私は次のようなWriter機能を持つ呼び出されたクラスを持っていますwriteVector: void Drawer::writeVector(vector<T> vec, bool index=true) { for (unsigned int i = 0; i < vec.size(); i++) { if (index) { cout << i << "\t"; } cout << vec[i] << "\n"; } } パフォーマンスを心配しながら、コードを重複させないようにしています。関数では、私のif (index)すべてのラウンドでチェックを行っていますforは、結果は常に同じですループのます。これは「パフォーマンスの心配」に反します。 for-ループの外側にチェックを配置することで、これを簡単に回避できました。ただし、重複したコードが大量に取得されます。 void Drawer::writeVector(...) { if (index) { for (...) { cout << i << …



3
範囲ベースのforループで転送参照を使用する利点は何ですか?
const auto&読み取り専用の操作を実行する場合は十分です。しかし、私はぶつかった for (auto&& e : v) // v is non-const 最近数回。これは私に不思議に思います: またはと比較して、一部のあいまいなケースで、転送参照を使用することでパフォーマンスが向上する可能性はありますauto&かconst auto&? (shared_ptrあいまいなコーナーケースの容疑者です) 更新 お気に入りで見つけた2つの例を。 基本型を反復するときにconst参照を使用することの欠点はありますか? 範囲ベースのforループを使用して、マップの値を簡単に反復できますか? 質問に集中してください:範囲ベースのforループでauto &&を使用する理由は何ですか?

2
C ++ 11でunordered_mapが挿入したものを破棄することは、C ++標準委員会の意図ですか?
unordered_map :: insert()が挿入した変数を破壊するという非常に奇妙なバグを追跡して、3日間の人生を失ったところです。この非常に明白でない動作は、ごく最近のコンパイラーでのみ発生します。clang3.2-3.4およびGCC 4.8が、この「機能」を示す唯一のコンパイラーであることがわかりました。 この問題を示す、私のメインコードベースからの削減されたコードを次に示します。 #include <memory> #include <unordered_map> #include <iostream> int main(void) { std::unordered_map<int, std::shared_ptr<int>> map; auto a(std::make_pair(5, std::make_shared<int>(5))); std::cout << "a.second is " << a.second.get() << std::endl; map.insert(a); // Note we are NOT doing insert(std::move(a)) std::cout << "a.second is now " << a.second.get() << std::endl; return 0; } …
114 c++  gcc  c++11  clang  standards 

9
2つ以上のコンテナーを同時に反復処理する最良の方法は何ですか
C ++ 11は、コンテナーを反復処理する複数の方法を提供します。例えば: 範囲ベースのループ for(auto c : container) fun(c) std :: for_each for_each(container.begin(),container.end(),fun) ただし、次のようなことを達成するために同じサイズの2つ(またはそれ以上)のコンテナーを反復処理するための推奨される方法は何ですか? for(unsigned i = 0; i < containerA.size(); ++i) { containerA[i] = containerB[i]; }

1
可変個関数のすべての引数でstd :: forwardをどのように呼び出しますか?
私は単に汎用オブジェクトファクトリを作成し、ブーストプリプロセッサメタライブラリを使用して可変テンプレートを作成していました(2010を使用していて、それらをサポートしていません)。私の関数はrval参照を使用std::forwardし、完全な転送を行うため、私は考えさせられました... C ++ 0Xが出て、標準のコンパイラーがあったとき、実際の可変テンプレートでこれを行います。それでも、私std::forwardは議論を呼びかけますか? template <typename ...Params> void f(Params... params) // how do I say these are rvalue reference? { y(std::forward(...params)); //? - I doubt this would work. } 私が考えることができる唯一の方法は... paramsを手動で解凍することを必要とするでしょう、そして私はまだそこにもまだありません。機能するより速い構文はありますか?


4
coutは同期/スレッドセーフですか?
一般に、ストリームが同期されていないと想定しています。適切なロックを行うかどうかはユーザー次第です。しかし、cout標準ライブラリで特別な扱いを受けるようなことはありますか? つまり、複数のスレッドが書き込みを行っている場合cout、coutオブジェクトを破壊できますか?同期しても、ランダムにインターリーブされた出力が得られることは理解していますが、インターリーブは保証されています。つまりcout、複数のスレッドから使用しても安全ですか? このベンダーに依存していますか?gccは何をしますか? 重要:ある種の証明が必要なので、「はい」と答えた場合は、回答の参照を提供してください。 私の懸念は、基礎となるシステムコールについても関係ありませんが、それらは問題ありませんが、ストリームによってバッファ層が追加されます。
112 c++  gcc  c++11 

20
std :: tupleの要素をどのように反復できますか?
(C ++ 11を使用して)タプルをどのように反復できますか?私は以下を試しました: for(int i=0; i<std::tuple_size<T...>::value; ++i) std::get<i>(my_tuple).do_sth(); しかし、これは機能しません: エラー1:申し訳ありませんが、実装されていません:「リスナー...」を固定長の引数リストに展開できません。 エラー2:定数式では使用できません。 では、タプルの要素を正しく反復するにはどうすればよいですか?

8
mt19937 PRNGを簡潔、移植性、完全にシードする方法
私は誰かが<random>乱数を生成するために使用することを提案する多くの答えを見るようです、通常は次のようなコードと共に: std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(0, 5); dis(gen); 通常、これは次のようなある種の「不吉な嫌悪」に取って代わります。 srand(time(NULL)); rand()%6; 我々は可能性がある批判侃々諤々で古い方法をtime(NULL)、低エントロピーを提供しtime(NULL)、予測可能であり、最終結果は不均一です。 しかし、それはすべて新しい方法に当てはまります。光沢のあるベニヤしかありません。 rd()単一のを返しますunsigned int。これは、少なくとも16ビット、おそらく32ビットです。MTの19937ビットの状態をシードするのに十分ではありません。 使用してstd::mt19937 gen(rd());gen()(32ビットで播種し、第一の出力を見て)良好な出力分布を与えません。7と13が最初の出力になることはありません。2つの種子は0を生成します。12の種子は1226181350を生成します。(リンク) std::random_device固定シードを持つ単純なPRNGとして実装できます。したがって、実行ごとに同じシーケンスが生成される可能性があります。(リンク)これはさらに悪いですtime(NULL)。 さらに悪いことに、前述のコードスニペットに含まれる問題にもかかわらず、コピーして貼り付けるのは非常に簡単です。これに対するいくつかの解決策は、すべての人に適しているわけではないかもしれない大量の ライブラリを取得する必要があります。 これに照らして、私の質問は、mt19937 PRNGをC ++で簡潔、移植可能、および完全にシードするにはどうすればよいですか? 上記の問題を考えると、良い答え: mt19937 / mt19937_64を完全にシードする必要があります。 だけに頼ることはできないstd::random_deviceか、time(NULL)エントロピーの源として。 Boostや他のライブラリに依存すべきではありません。 少数の行に収まるようにして、回答にコピー貼り付けして見栄えをよくする必要があります。 考え 私の現在の考えは、か​​らの出力をstd::random_device(おそらくXORを介して)マッシュアップしtime(NULL)、アドレス空間のランダム化から派生した値、およびハードコーディングされた定数(配布中に設定できる)を使用して、エントロピーでベストエフォートショットを取得できると考えています。 std::random_device::entropy() ていないものの良い指標を与えるstd::random_deviceか、しない場合がありますが。
112 c++  c++11  random 

4
列挙型クラスを基になる型に変換できますか?
enum classフィールドを基になる型に変換する方法はありますか?これは自動だと思ったが、どうやらそうではなかった。 enum class my_fields : unsigned { field = 1 }; unsigned a = my_fields::field; その割り当てはGCCによって拒否されています。error: cannot convert 'my_fields' to 'unsigned int' in assignment。
112 c++  c++11 

6
`const`オブジェクトで` std :: move`を使用できるのはなぜですか?
C ++ 11では、次のコードを記述できます。 struct Cat { Cat(){} }; const Cat cat; std::move(cat); //this is valid in C++11 を呼び出すとstd::move、オブジェクトを移動することを意味します。つまり、オブジェクトを変更します。移動するにはconstオブジェクトは不合理ですが、なぜstd::moveこの動作を制限しないのですか?将来的には罠になりますよね? ここでトラップとは、ブランドンがコメントで言及したとおりです。 「彼はそれが彼をこっそりとこっそりと「罠にかける」ことを意味していると思う。もし彼が気付かないと、彼は結局彼が意図したものではないコピーで終わるからだ。」 スコットマイヤーズの著書「Effective Modern C ++」で、彼は例を挙げています。 class Annotation { public: explicit Annotation(const std::string text) : value(std::move(text)) //here we want to call string(string&&), //but because text is const, //the return type of std::move(text) …
112 c++  c++11 

13
C ++で「if」条件が含まれる「for」ループを回避するにはどうすればよいですか?
私が作成するほとんどすべてのコードを使用して、コレクション内の最終的な単純な "if"条件で終わるコレクションのセット削減問題に対処しています。以下に簡単な例を示します。 for(int i=0; i<myCollection.size(); i++) { if (myCollection[i] == SOMETHING) { DoStuff(); } } 関数型言語では、コレクションを別のコレクションに(簡単に)削減して問題を解決し、削減したセットですべての操作を実行できます。疑似コード: newCollection <- myCollection where <x=true map DoStuff newCollection そして、C#のような他のCバリアントでは、次のようなwhere句で減らすことができます foreach (var x in myCollection.Where(c=> c == SOMETHING)) { DoStuff(); } 以上(少なくとも私の目には) myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d)); 確かに、私は多くのパラダイムミキシングと主観/意見ベースのスタイルを行っていますが、この推奨される手法をC ++で使用できるようにするための根本的な何かが欠けていると感じざるを得ません。誰かが私を啓発できますか?
111 c++  c++11  c++14 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.