ぷろみん

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

C++

中途半端な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 } } 正しい書き方 // #include <algorithm>が必要 auto result = std::find(list.cbegin(), lis</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++

アンドロイドアプリ作りました play.google.com 良かったらプレイしてみてください。 イテレータ無効化ルール イテレータは容易に無効化されます。 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>…

関数ポインタよりもstd::functionを使おう

C++

アンドロイドアプリ作りました play.google.com 良かったらプレイしてみてください。 書きやすさ // 関数ポインタ void (*Func)(void); void (Foo::*Func2)(void); // std::function std::function<void(void)> Func; std::function<void(Foo*)> Func2; これは慣れてないと両方読みづ</void(foo*)></void(void)>…

C++の初期化は分かりにくい2

前の C++の初期化は分かりにくい - ぷろみん newしてもゼロクリアされる訳じゃない struct Foo{ int a; }; // デフォルト初期化、aは不定 auto foo1 = new Foo; // 値初期化、aは0 auto foo2 = new Foo(); 省略可能なのでまさかと思ったら、やっぱりnewにも…

C++の初期化は分かりにくい

アンドロイドアプリ作りました play.google.com 良かったらプレイしてみてください。 概要 C++の初期化関係が複雑に感じたのでまとめました。 初期化の種類 まず、以下の3つの初期化が存在するのが分かりにくいです。 // デフォルト初期化 Foo foo; // 値初…

生配列よりもstd::arrayを使った方が良い理由

C++

概要 生配列を使う人がstd::arrayを使うきっかけになれば良いなと思います。 パフォーマンス 最適化をかければstd::arrayは生配列と全く同じアセンブリを吐き出す事が知られています。 つまり、パフォーマンスに差はありません。 アルゴリズム アルゴリズム…

forに名前を付けてあげましょう

C++

概要 何故forを使うべきでないかを解説します。 比較 とりあえず、forを使った例と使わなかった例を見てみましょう。 // for int items_count = 0; for(auto item: v){ if(item == 3){ ++items_count; } } // non for int items_count = std::count(v.begin(…

Initを作らないで

C++

モチベーション Initとかの関数作る人多いので、無い方が良いって事を伝えたいです。 Initが駄目な理由 一番の理由は標準機能では無いからです。 Initがあるクラスもあれば、無いクラスもある。InitじゃなくてConstructかもしれないし、Startかもしれないし…

shared_ptrとunique_ptrとweak_ptr

C++

モチベーション スマートポインタの使い方を勘違いしている方が多いので スマートポインタの意味 スマートポインタの一番重要な所はポインタに意味付けする事ができる事にあります。 shared_ptrは共有するポインタである事を示し unique_ptrは自分で開放する…

依存関係を隠さないで

C++

モチベーション 依存関係を隠そうとして依存関係を深くしないように。 どちらが良い設計? Foo::Foo() { texture_ = Singleton::GetInstance()->GetTexture(); } // 依存性無しに構築できる? Foo foo; Foo::Foo(const Texture &texture): texture_(texture) …

namespaceとUtilityクラス(staticメンバ関数)

C++

モチベーション namespaceとUtilityクラスでは同じような機能を提供できる。どちらを使うべきか。 namespace namespace Foo { struct Object {}; void Function(Object) {} } int main() { Foo::Object foo; // ADLにより解決されるので簡易にかける Functio…

メンバ初期化子

C++

モチベーション メンバのコンストラクタ初期化子と宣言初期化子って役割被ってるので、どういう時にどっちを使った方が素敵か考えてみました。 コンストラクタ初期化子 class Foo{ public: Foo() // コンストラクタ初期化子 : a_(0) {} private: int a_; }; …

std::experimental::optional

C++

モチベーション ついにoptionalが標準ライブラリに来て嬉しかったので。 optional C++17にはoptionalが追加されるようです。 optionalを使うと以下のような処理が改善されます。 取得に失敗する関数を書く時どうしますか? #include<iostream> struct Foo { Foo()=defa</iostream>…

Pimplイディオムはアンチパターン

C++

モチベーション ある時、Pimplイディオムはアンチパターンという言葉を聞きました。 良いパターンだと思ってたので何でだろうと考えてみました。 Pimplイディオムの利点 class Foo { public: // 公開部分 private: class Impl; std::unique_ptr<Impl> pimpl_; }; </impl>…