ぷろみん

プログラミング的な内容を扱ってます

C++

最近OpenGLを触っていたので、オススメの勉強法

C++

検索 検索ワード + wikiで検索すると情報の精度が格段に上がる。 これはOpenGL規格を策定しているkhronosが運営しているwikiに素晴らしい情報が集約しているから。 https://www.khronos.org/opengl/wiki この機能は非推奨だよとか、この機能の代わりにこの機…

C++でslice windows

C++

Ranges library (C++20) - cppreference.com が楽しそうなので遊んでみます。 filter / mapに対応してくれるのはありがたいです。 range/v3がイテレータライブラリのようで slidingやzip等の欲しい機能はそろってそうに見えました。 しかし、記事内のpositio…

MSVCでも頑張ってC++20で導入されるspanを使う

C++

wandboxではspanを利用できるので動作確認だけならそちらが簡単です。 何故人はstringを使わないのか stringは内部バッファに文字列を蓄えるので例えば std::vector<std::string> Split(const std::string& text); みたいな関数があった時に入力のテキストと出力の分割文</std::string>…

C++でgRPC for Windows

C++

必要な前提知識 gRPC Protoファイルとそのコンパイル ライブラリのビルド gRPCはビルドパスが複雑な上、公式のWindows対応が少し弱いため試すだけで一苦労になりがちです。 単にやってみたいだけなら安定して色々できるGoを使うことをお勧めします。Windows…

C++17から導入される範囲 for ループの制限緩和で何が変わるか

C++

概要 C++17で範囲forループのbeginとendで違う型を指定できるようになりました。 範囲 for ループの制限緩和 - cpprefjp C++日本語リファレンス これによって何が変わるのでしょうか。 イテレータの思想の違い STLのイテレータはメモリはコンテナが持ってイ…

C++の難しめな用語集

C++

概要 先日、言いたい用語がすぐに出てこなかったので備忘録を作った。私が学習するのが遅かったり難しかったものを集めた。 その特性から多くは語らないのでググって。 Return Value Optimization (RVO) Named Return Value Optimization(NRVO) データ指向設…

VisualStudio2017はC++17に対応しているがデフォルトでは無効になっている

C++17を有効にする プロジェクト > プロパティ > 構成プロパティ > C/C++ > 言語 > C++言語標準 から設定できます。 せっかくMSが標準まで追いついてくれたのに有効にしないともったいないです。 おまけ 上記を言いたかっただけなんですが、あまりに短かった…

std::vectorのようなコピーコストの高いクラスに参照を使ってはいけないシチュエーション

C++

概要 RVO(Return Value Optimization)の話です。特別に触れませんがNRVO(Named RVO)も最適化されるものとして話を進めています。 昔の効率の良いコード void Initialize(std::vector<int>& buffer) { // bufferに色々な計算結果を詰める buffer.emplace_back(5); </int>…

C++コーディングガイドライン哲学1

C++

概要 https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md の「P: Philosophy」の感想や補足です。 アイディアを直接コードで表現する 例としてStrong typeやfor文の代わりにアルゴリズムを使うことを提案しています。 また、con…

好きなC++ランキング

C++

好きなだけで使えるとは言っていない所がポイントです。 コンパイラだけでなく、周辺環境も含めて考慮しているのでC++としています。 1位 wandbox + clang/gcc 個人的に新機能を試す時が一番幸福度が高いのでこの組み合わせが好きです。 環境構築が必要なし…

自分で作ったクラスをrange based forに対応させよう

C++

Range based forは素敵 for(auto value: vector){ } 良いですね、スマートです。 しかし、これstd::vector等のスタンダードライブラリに入っているクラスしか使えないと思ってはいないでしょうか? 私が体験した職場で自身のクラスをrange based forに対応さ…

綺麗にコードを書く技術

概要 難しい処理をこなす処理を簡単に描けるプログラマではそのコードは汚いものです。 思うに綺麗にコードを書くことは技術のレベルとは関係ないので執着されないのでしょう。 しかし、私は綺麗にコードを書くことは無駄には思えません。 技術が技術と呼ば…

中途半端なbit幅の符号付整数を扱い易くするSign extending trick

C++

charじゃ大きすぎる charは何気に256もの数字を記録できます。 しかし、組み込みのような制限の厳しい環境では1bitでも送受信のデータは節約したいものです。 そんな時はbit演算を駆使してデータをやりとりすることになるのですが、困った状況というものがあ…

C++では典型的なif文は使わない方が良い

C++

よくある間違い あなたはコンテナから指定のデータを探す時に以下のようなコードを書いていませんか? for(int i = 0; i < 10; i++) { if(list[i] == 5) { // do something break; } } 正しい書き方 // #include <algorithm>が必要 auto result = std::find(list.cbegin</algorithm>…

C++で無理矢理クロージャを使ってみる

C++

クロージャ 現在クロージャという表現を使う場合状態を持ったラムダを指す場合が多い気がします。 つまり、ワンライナーで書けるクラスといった感じです。これはC++では関数オブジェクト的な手法で似たようなことができますが、javascript程普通なものではあ…

基本クラスの継承を考えたデストラクタの属性設定

C++

概要 この記事は間違った情報が多分に含まれるため https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c35-a-base-class-destructor-should-be-either-public-and-virtual-or-protected-and-nonvirtual と https://github.com/…

シングルトンを使うのはやめよう

C++

概要 この記事はC++の作者Bjarne Stroustrup等によって書かれたコーディングガイドラインのAvoid singletonsの箇所の翻訳です。 https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Ri-singleton シングルトンを使うのはやめよ…

DirectX12をビルド可能なプロジェクトを作る

前回 ようやくWindows10にしたのでDX12プログラミングを始めてみた - ぷろみん ビルド New Project -> Win32 Project -> Empty Project 新しく生成されたフォルダに前回ビルドに成功したサンプルの.cppと.hをコピーしてきます。 Solution Explorerのファイル…

ようやくWindows10にしたのでDX12プログラミングを始めてみた

概要 Windows10にしたらまず最初にすべき事といえば・・・ そう、DirectX12プログラミングですよね。 今回はその導入をやってみたのでメモしておきます。 Visual Studioのアップグレード 始めから入ってない人もここで入れるので一緒です。 Direct3D12 開発…

Concept Lite(軽量コンセプト)で出来る事

C++

概要 gcc6.0にてConcept Liteのコンパイルができるようになったので、色々と触ってみました。 wandboxを利用すれば簡単に試す事ができます。 [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ 書き方 conceptはconstexprな関数や変数としても解釈されるので以下の書き方は両方…

std::vectorの正しい使い方

C++

イテレータ無効化ルール イテレータは容易に無効化されます。 Iterator Invalidation Rules (C++0x) 例えばvectorはコンテナサイズよりも要素が増えた場合、要素が取り除かれた場合にイテレータは無効化されます。 なので、基本的にイテレータが無効化される…

privateコンストラクタじゃなくてDefaulted and Deleted Functionsを使おう

C++

概要 参考 Explicitly Defaulted and Deleted Functions privateコンストラクタによるコピー不可クラスにはいくつかの問題があります。 コピーコンストラクタをprivateにするとコンストラクタが必要になる struct NonCopyable { // 何もしない場合でもコンス…

静的optional

C++

モチベーション ヘッダの依存性を減らしたい(コンパイラファイアウォールを強くしたい) しかし、動的メモリ確保を行いたくない おしいoptional optionalは静的確保できるポインタの様な物です。 静的型をnullableにする為に使われます。 後でコンストラク…

修正:C++のAbstractFactoryはvirtualを使わない

C++

C++のAbstractFactoryはvirtualを使わない - ぷろみん 前回のが抽象化できてない事が発覚したので修正しました。 前回のに修正を乗っけようと思ったのですが、そうするとMixinらへんも関係無くなるので新しいのにしておきました。 抽象化 #include<iostream> namespace</iostream>…

C++のAbstractFactoryはvirtualを使わない

C++

抽象化ができてなかったので修正しました。 修正:C++のAbstractFactoryはvirtualを使わない - ぷろみん 継承 C++では出来る限り継承は使わない方が良いです。 理由としては結びつきが強すぎるからです。 メンバに持って目的の挙動を達成できるのなら、そち…

ポインタよりも参照を使おう

C++

あんまり関係の無い所 int& aとint &aのどちらで書くでしょうか? 私はint &aの方で書きます。 // int i; // int *ip; // int *const ipc = &i; // int &ir = i; int i, *ip, *const ipc = &i, &ir = i; // const int ci = 0; // const int *cip; // const i…

push_backよりもemplace_backを使おう

C++

emplace push_backでは無駄なコストが発生してしまいます。 そこで、直接コンストラクトできるemplace_backがC++11から追加されました。 #include<vector> namespace torini{ struct Data{ Data(int, int, int){} }; } int main(){ std::vector<torini::Data> v; // 無駄にコンスト</torini::data></vector>…

mapよりもunordered_mapを使おう

C++

unorderedとは 要するにハッシュです。検索が早くなるので基本的にはunordered_mapを使いましょう。 mapはorderedつまり常にソートされた状態で保持されますが、これが有効に働くことは連想配列的な使い方ではまず無いでしょう。 でもkeyに複雑な値が来る場…

探して見つかった場合と見つからなかった場合の処理

C++

C++14の機能を利用しているのでコンパイラによってはビルドが通らないです。 ありがち 処理の分割がいまいちで、コードを読む時に分かりにくいです。 また、for内で読み込みと書き込みを同時に行っているのは良くない書き方の兆候です。 #include<vector> #include<utility> i</utility></vector>…

C++14の簡単に利用できる便利な機能

ラムダ引数の自動化 int main(){ std::vector<int> v; // ラムダの引数にautoが使える std::for_each(v.begin(), v.end(), [](auto i){ std::cout << i; }); } ラムダ引数が複雑になった場合記述するのは冗長です。 その冗長性が省略できるのは簡単でかつ便利です</int>…