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

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。


2
Constオーバーロードがgccで予期せず呼び出されました。コンパイラのバグまたは互換性の修正?
charおよびconst char配列のテンプレートのオーバーロードに依存する、はるかに大きなアプリケーションがあります。gcc 7.5、clang、およびビジュアルスタジオでは、以下のコードはすべてのケースで「NON-CONST」を出力します。ただし、gcc 8.1以降の場合、出力は次のようになります。 #include <iostream> class MyClass { public: template <size_t N> MyClass(const char (&value)[N]) { std::cout << "CONST " << value << '\n'; } template <size_t N> MyClass(char (&value)[N]) { std::cout << "NON-CONST " << value << '\n'; } }; MyClass test_1() { char buf[30] = "test_1"; return …

7
C ++で再帰的に整数のテンプレートパラメーターを一致させることは可能ですか?
次の問題があります。N次元ベクトルを次のように定義します #include <vector> #include <utility> #include <string> template <int N, typename T> struct NVector{ typedef std::vector<typename NVector<N-1,T>::type> type; }; template <typename T> struct NVector<1,T> { typedef std::vector<T> type; }; ネストされたベクトルのリーフ要素をいくら深くても変換でき、同じ形状の新しいネストされたベクトルを返す、より高次の関数マップを書きたいと思います。私が試してみました template <int N, typename T, typename Mapper> struct MapResult { typedef decltype ( (std::declval<Mapper>()) (std::declval<T>()) ) basic_type; typedef typename NVector<N, …

5
assert()とstatic_assert()の間でディスパッチする方法、constexprコンテキストに依存するか?
C ++ 11 constexpr関数では、anなどの2番目のステートメントassert()は使用できません。A static_assert()は問題ありませんが、関数が「通常の」関数として呼び出された場合は機能しません。カンマ演算子はwrtoを助けるために来るかもしれません。assert()しかし、醜いですし、いくつかのツールは、それについての警告を吐きます。 アサーションのほかに完全に制約可能な「ゲッター」を検討してください。しかし、実行時とコンパイル時に何らかのアサーションを保持したいのですが、 'constexpr'コンテキストによってはオーバーロードすることはできません。 template<int Size> struct Array { int m_vals[Size]; constexpr const int& getElement( int idx ) const { ASSERT( idx < Size ); // a no-go for constexpr funcs in c++11 // not possible, even in constexpr calls as being pointed out, but what I …

1
std :: reduceとstd :: accumulateのどちらを選択するのですか?
std::accumulateそして、std::reduceほぼ同じことを行います。 の要約std::reduceはそれをすべて言います: similar to `std::accumulate`, except out of order 多くの場合、これらの関数は同じ最終結果をもたらし、同じ全体的な機能を発揮します。非常に重い負荷計算などを行っている場合はstd::reduce、並列化を試すことができます。つまり。ここで鳥の観点から見た従来の知恵は何ですか?明示的に最適化しない限り、常に鈍いstd :: accumulateに固執する必要がありますか?またはデフォルトで使用する必要がありますstd::reduceか? 場合はstd::reduce、少なくとも速さとして常にある(選択されたデフォルト/なし実行ポリシーを持つ)std::accumulate(少数の命令保存)、私は順序が厳しいときに累積にのみ使用されるべきだと思います。

1
C ++でconstオブジェクトを宣言するには、ユーザー定義のデフォルトコンストラクターが必要です。可変メンバー変数がある場合、どうしてですか?
C ++では、メンバー変数を持つクラスのオブジェクトをとして宣言するにconstは、ユーザー定義のデフォルトコンストラクターが必要です。次のコードはこれを示しています。 class Some { int value; }; int main() { // error: default initialization of an object of const type 'const Some' // without a user-provided default constructor const Some some; return 0; } ただし、クラスが所有するメンバー変数が変更可能として修飾されている場合、コンパイラーはエラーを報告しません。参考までに、コマンドを使用してコンパイルしましたclang++ -std=c++17 -stdlib=libc++ helloworld.cpp -o helloworld.out --debug。この結果はコンパイラのバグによるものなのか、C ++言語で定義された構文によるものなのでしょうか。 class Some { mutable int value; }; …
8 c++  clang++ 

1
Swig C ++:インターフェースベクター<クラスオブジェクト*>
基本的に私はPythonで値の異なるデータ型の辞書(float / int / bool / char / list)を含むタプル/リストを作ろうとしています。 私はこれを次のコードから取得しています: (&lt;f_p.Bunch; proxy of &lt;Swig Object of type 'Bunch *' at 0x7f4954bdde10&gt; &gt;, &lt;f_p.Bunch; proxy of &lt;Swig Object of type 'Bunch *' at 0x7f4954bdde40&gt; &gt;, &lt;f_p.Bunch; proxy of &lt;Swig Object of type 'Bunch *' at 0x7f495668be70&gt; &gt;, &lt;f_p.Bunch; proxy of &lt;Swig …
8 c++  c++11  c++14  swig 

1
MINGW gccでコンパイルすると、std :: stringに対してオーバーロードされた新しい演算子が呼び出されない
このプログラム(オプションでコンパイル-std=c++17) #include &lt;stdio.h&gt; #include &lt;string&gt; void* operator new(std::size_t nrOfBytes) { printf("allocate %zd bytes on heap\n", nrOfBytes); void* p = malloc(nrOfBytes); if (p) { return p; } else { throw std::bad_alloc{}; } } int main() { // new operator is called when compiled with Clang or MSVS or GCC int* i …
8 c++  gcc  stdstring  gcc9 

1
memcpyバッファーUBでreinterpret_castを使用していますか?
コードを考える struct A {}; auto obj = new A; std::vector&lt;unsigned char&gt; buffer; buffer.resize(sizeof(obj)); std::memcpy(buffer.data(), &amp;obj, sizeof(obj)); // this copies the pointer, not the object! // ... auto ptr = *reinterpret_cast&lt;A**&gt;(buffer.data()); // is this UB? delete ptr; reinterpret_castこの場合の使用法はUBですか?memcpyはインスタンスの存続期間を開始しないため、厳密なエイリアシングルールに違反しstd::bit_castているため(そういうわけで、C ++ 20に追加されました)。 そして、キャストを別のキャストに置き換えるとmemcpy(ポインターを読み取るため)、プログラムは明確に定義されますか?


4
C ++メタプログラミングですべてのテンプレートを使用していますか?
私はメタプログラミングが一般的であり、特にそれがC ++で何であるかを理解しようとしています。c ++メタプログラミングを検索すると、テンプレートメタプログラミング(TMP)のチュートリアルは表示されますが、テンプレートの特定の使用法またはテンプレートのすべての使用法のみが分類されているかどうかの説明はありません。 私の質問は、C ++でのテンプレートのすべての使用がメタプログラミングとして分類されるかどうかです。それがなぜなのか、そうでないのかについての説明も役に立ちます。ありがとうございました。

1
アトミックタイプのベクトルを割り当てる方法は?
どうすれば、原子の型を持つベクトルのメンバーを割り当てることができますか? #include &lt;iostream&gt; #include &lt;thread&gt; #include &lt;vector&gt; using namespace std; int main() { vector&lt;atomic&lt;bool&gt;&gt; myvector; int N=8; myvector.assign(N,false); cout&lt;&lt;"done!"&lt;&lt;endl; } https://wandbox.org/permlink/lchfOvqyL3YKNivk prog.cc: In function 'int main()': prog.cc:11:28: error: no matching function for call to 'std::vector&lt;std::atomic&lt;bool&gt; &gt;::assign(int&amp;, bool)' 11 | myvector.assign(N,false); | ^

3
現在のテンプレートをテンプレートパラメータの1つに対するテンプレートパラメータとして使用する
一般的なグラフ構造を作成しようとしていますが、頂点とエッジの間の循環依存関係に遭遇しています。私はVertexクラスとEdgeクラスを次のように定義します。 template&lt;typename EdgeType&gt; struct Vertex { std::vector&lt;EdgeType&gt; successors; }; template&lt;typename EdgeCostType, typename VertexWrapper&gt; struct Edge { EdgeCostType cost; VertexWrapper source; VertexWrapper dest; }; のようなものでインスタンス化したいのですがVertex&lt;Edge&lt;int, std::shared_ptr&lt;decltype(v)&gt;&gt;&gt; v;、明らかにできません。この循環依存関係を解決するにはどうすればよいですか? 編集: この問題の要約は、現在のテンプレートを現在のテンプレートのテンプレートパラメータの1つに対するテンプレートパラメータとして使用することです。 template&lt;typename VertexWrapper&gt; struct Vertex { std::vector&lt;pair&lt;int, VertexWrapper&lt;Vertex&gt;&gt;&gt; successors; };

1
時間テキストをコンパイルして数値変換する(atoi)
コンパイル時にatoi()関数を実装したい(C ++ 11またはC ++ 14標準を使用して、C ++言語で)。したがって、二重引用符で囲まれたテキストを数値として解析したり、エラーを再現したりできます。より具体的には、それはコンパイル時にprintfのような形式を解析できるより大きなシステムの一部です。そして、私は単語のフォーマット文字列を分割し、特定の単語を数字で表すことができる場合は、文字列ではなく番号を出力します(シーンの背後にあるシリアライザクラスは、文字列よりも数値をより効率的にシリアル化できます。重要なのは、デシリアライザはすべての文字列を数値として解析しようとしないことです。これは、フォーマット文字列内に出力されるすべての数値は常に数値として表現され、文字列としては表現されないためです...) 私が2つ知っているように、タスクを解決するには2つの方法があります。 1)constexpr関数を使用する。 2)テンプレートのメタプログラミング。 どっちがいいの?私は最初の方法を試しましたが、この方法には多くの障害があることがわかります。特に、c ++ 11に関連するいくつかの制限があります。2番目のように見えるかもしれませんが、いくつかのトリックが必要です(c ++ 14から始まるgccおよびc ++ 11から始まるclangでサポートされている、演算子 ""を使用して文字列を分割して文字を分離する必要があります。 )。また、完全にTMPに基づくソリューションは、大きすぎて複雑すぎます。 以下は私の解決策です、私はそれについていくつかの提案を聞いてうれしいです。 http://coliru.stacked-crooked.com/a/0b8f1fae9d9b714b #include &lt;stdio.h&gt; template &lt;typename T&gt; struct Result { T value; bool valid; constexpr Result(T v) : value(v), valid(true) {} constexpr Result() : value(), valid(false) {} }; template &lt;typename T&gt; constexpr …

3
ソートされたベクトルに、特定の値に加算されるペアがあるかどうかを線形時間で調べます
std::vector昇順で並べ替えられた個別の要素を考慮して、合計が特定の値であるコレクションに2つの要素があるかどうかを判断するアルゴリズムを開発したいと思いますsum。 私はそれぞれのトレードオフで2つの異なるアプローチを試しました: ベクトル全体をスキャンし、ベクトルの各要素std::lower_boundに対してsum、現在の要素との差に対応する要素を検索するために、ベクトルにバイナリ検索()を適用できます。これは、追加のスペースを必要としないO(n log n)時間ソリューションです。 ベクトル全体をトラバースしてにデータを入力できstd::unordered_setます。次に、ベクトルをスキャンし、各要素std::unordered_setについて、とsum現在の要素の違いを調べます。ハッシュテーブルの検索は平均して一定の時間で実行されるため、このソリューションは線形時間で実行されます。ただし、このソリューションでは、std::unordered_setデータ構造のために追加の線形スペースが必要です。 それにもかかわらず、線形時間で実行され、追加の線形スペースを必要としないソリューションを探しています。何か案は?スピードとスペースのトレードオフを強いられているようです。
8 c++  algorithm  c++11  search  stl 

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