C++

boost::optional と boost::logic::tribool の違い

C++

boost::optionalの説明でも書かれていますが、一応メモ。 boost::triboolは3値論理と言われるものを表現するための型です。 一般の論理値、true, falseに加えて、indeterminate(不定)というものが加わっています。 これはboost::optionalに非常によく似てい…

neocomplcacheの設定が上手くいかない…(解決しました)

neocomplcacheの補完機能がいいらしいという噂を聞きつけてやってみようとしたものの…"std::"と打った時は補完されるのですが、"boost::"では補完が効かない。 clangを直接たたいた時は"boost::"でも補完が効くので困ってたり。追記:一応動くようにできまし…

Qt @福岡 第4回勉強会に参加(&発表)してきました

C++

今回はQt @福岡 第4回勉強会に参加(&発表)してきました。Qt @福岡 勉強会への参加は今回で2回目で、毎回あまり発表上手でない私が発表をさせてもらっています。本当にいつも発表させてもらってありがたいです。今回は発表される方が多いということで、前…

C++0xの戻り値型の後方宣言

C++

後方宣言でどのようなことができるのかについて考えてみる。 たとえば、型TとUを引数にとり、その二つの引数をoperator*()で計算する関数を考えてみる。後方宣言を使わずに書こうとすると template<class T, class U> decltype(*(T*)(0)**(U*)(0)) foo(T x, T y) { ... } のよ</class>…

適当にC++0xで使えるようになるMoveコンストラクタを試してみる

C++

#include <iostream> #include <vector> #include <memory> using namespace std; class Sample { public: // 普通のctor Sample( int x ) { vec = unique_ptr<vector<int> >( new vector<int>() ); vec->push_back( x ); } // Move ctor Sample( Sample && r ) { // ちなみに、ただのcopy ctorでmoveな</int></vector<int></memory></vector></iostream>…

Exceptional C++を1周読み終えました

C++

Exceptional C++―47のクイズ形式によるプログラム問題と解法 (C++ in‐Depth Series)作者: ハーブサッター,浜田光之,Harb Sutter,浜田真理出版社/メーカー: ピアソンエデュケーション発売日: 2000/11メディア: 単行本購入: 9人 クリック: 134回この商品を含む…

テスト駆動開発の練習(17) -C++&GoogleTestでポーカーの役判定(3)-

とりあえず、今回で役判定の記事は最後にします。今回は存在しないカードの数字やスートも数字も同じカードが2枚以上無いかと言った反則に当たるものがないかを判定しています。また、前回までのコードの問題点を直し、リファクタリングもしています。(結局…

テスト駆動開発の練習(16) -C++&GoogleTestでポーカーの役判定(2)-

前回、ポーカーの役を数値のみで判定していたので、少し進めてスートでも判定できるように構造体と列挙体を用いて改良することにしました。その過程で前回のテストに足りていなかった境界値が存在することに気がつきました。その辺りは後で書くとして、今回…

テスト駆動開発の練習(15) -C++&GoogleTestでポーカーの役判定-

久々にC++&GoogleTestをやりました。最近、写経や試しに使ってみるとかしかしてなかったのと、他の言語がある程度身についてしまっていて書き間違いがやり始めたときに多少目立ちましたが、後半で少し勘を取り戻せた感じです。今回はスートは考えずに数字の…

C++のADL(Argument-dependent name lookup)

C++

昨日、宮城県沖を震源とする地震が発生していましたね。地震だけでなく津波による被害も大きいようですね。被害に合われた皆さんが一日も早く平穏な生活を取り戻せることを願っています。ちなみに私は生まれも育ちも現住所も西日本なので、全く被害はありま…

Qtのテストのためのライブラリ 『QTestLib』 を使ってみた

久しぶりの更新です。 そうはいっても、友人知人のブログの更新頻度を見ているとそうでもない方なのかな?更新頻度って人によってまちまちでブログの更新頻度って人それぞれですよね。 それはさておき『QTestLib』について。しっかりしたことを書くというよ…

Const auto_ptrイディオム

C++

ちょっと前に書いたC++0xの機能(shared_ptr/スマートポインタ)に出てきたConst auto_ptrについてまとめてみることにしました。調べればすぐにわかることですし考えてもわかることかもしれませんが、auto_ptrをconstで宣言することで所有権の移譲を防止するす…

Qt触ってみた (1)

C++

「Qt触ってみた」ということで記事書いてみることにしました。まだまだ初心者なのであんまり難しいことは書けないですが、頑張っていきます。まずはインストールから始めます。Windowsならかなり簡単で、このページからダウンロードしてインストーラに従って…

C++0xの機能(weak_ptr/スマートポインタ)

C++

今回はweak_ptr。weak_ptrは弱参照の概念のためのスマートポインタです。shared_ptrでは循環参照の問題を解決できません。 #include <iostream> #include <memory> class Sample { public: Sample() {} ~Sample() {} std::shared_ptr<Sample> ptr; }; int main() { std::shared_ptr<Sample> p1(</sample></sample></memory></iostream>…

ちょっとテンプレートメタプログラミング (1)

C++

私は最近C++ばかりやってますね。(コードを書いているわけではありませんが)C++の中でもC++0xやBoostについてが最近は多いのですが、その中でもテンプレートを用いたメタプログラミングは現在初心者として頑張っているところです。 メタプログラミングとはそ…

shared_ptrとunique_ptr(カスタムデリータの指定)

C++

unique_ptrやshared_ptrは、カスタムデリータを指定できるようになっています。たとえば次のような場合、deleteの処理では十分ではありません。(「C++なんだからfstreamの…」っていう突っ込みは無し) std::unique_ptr< FILE > filePtr( fopen(...) ); // fcl…

C++0xの機能(unique_ptr/スマートポインタ)

C++

今回は前回のshared_ptrの説明の最後にちょっとだけ顔を出したunique_ptrについて。ちなみにWikipediaを見てみるとわかるとおり、また、unique_ptrがauto_ptrの代わりとして導入され、auto_ptrは非推奨とされる。unique_ptrはauto_ptrの全機能を提供するが、…

C++0xの機能(shared_ptr/スマートポインタ)

C++

さて、今回は"General-purpose smart pointers"(汎用高性能なスマートポインタ)の中でも所有権を共有できるshared_ptrについて。現在のC++では、auto_ptrという「所有権を一つしか持てない」スマートポインタが存在します。(色々と文句を言われ続けたスマー…

C++0xの機能(静的な表明)

C++

いまさらですが、コンパイラの動きでも確認してみましょうか。えっ?タイトルと内容が違う?いえいえ、タイトルと関係あるんです。コンパイラは大体『プリプロセス→パース→コードジェネレート→アセンブル→リンク』といった流れで動いています。この後に出来…

PImplイディオム

C++

今回はPImplイディオム。プログラミング全般に入れるべきか悩んだんですが、これはC++のポインタという概念があってこそのものかなということでカテゴリはC++にしました。なぜこのタイミングでPImplイディオムを書くかというと、今日あったわんくま同盟の勉…

C++0xの機能(インスタンス化されていないクラスメンバへのsizeof)

C++

少しずつでもC++0xについて書きすすめておくために、ゼミの予習で時間がないものの、この辺なら書けるかなということで、"Allow sizeof to work on members of classes without an explicit object"(インスタンス化されていないクラスメンバへのsizeof)。い…

C++0xの機能(long long int)

C++

今回は"long long int"。C99で標準化されたので、C++0xでも標準化されるようです。一般的な64ビットシステムではデータサイズは short int si; /* 16ビット */ int i; /* 32ビット */ long int li; /* 64ビット */ のようになっています。しかし、現在32ビッ…

C++0xの機能 (ユーザー定義リテラル)

C++

今回は"User-defined literals"(ユーザー定義リテラル)。これって使い道あるの?とか言う疑問、質問は受け付けないのであしからず。(私はとりあえず使い道は今のところこれと言ってない)さて、ユーザー定義リテラルとは何か。読んで字のごとく「ユーザーが定…

C++のtemplateの規則

C++

ちょっとばかり調べてみたけれど、以外としっかり書かれているサイトが見つからなかったので自分のメモ書きとして書いておいてみようと思います。(書いてあるサイトは結構あるとは思うんですが、見つけれませんでした・・・)先に断っておくと、この記事で書…

C++0xの機能(制限のない共用体)

C++

今回は"Unrestricted unions"(制限のない共用体)。共用体って使う機会があんまりなくて、今まで言語の勉強として以外に使ったことがない・・・。 そんな感じなので、制限なんて気にしたことがなかったですね。そんな様々な制限があったとは・・・。 とりあえ…

C++0xの機能 (ラムダ関数とラムダ式)

C++

結構C++0xの機能を書いてる気がするけど、全てを書くにはまだまだ大量の記事が必要になるレベル。これだけの量なら遅れるのも仕方ない?そんなことはさておき、今回は"Lambda functions and expressions"(ラムダ関数とラムダ式)。ラムダ関数やラムダ式という…

C++0xの機能 (強い型つけの列挙型)

C++

今回は"Strongly typed enumerations"(強い型つけの列挙型)。今まで、列挙型は整数値として扱われるために、型の違う列挙型同士の比較が可能であるという問題点がありました。そこで、C++0xではクラス化された列挙型(enum class)が導入されます。enum class…

C++0xの機能 (山括弧)

C++

今回は"Right angle bracket"(山括弧)。そもそも">"って「山括弧」って日本語で言うんですね。それはさておき、C++0x以前において、次のプログラム std::vector<std::vector<int>> v; /* 最後の">>"が右シフトと解析される */ void func(std::vector<int>= v); /* ">="が比較演算子</int></std::vector<int>…

C++0xの機能 (右辺値参照)

C++

今回は"Rvalue reference"(右辺値参照)について。関数に一時変数(代入演算子の右辺に来る値なので右辺値と呼ばれる)を参照することができると、効率的な実装ができるようになる(らしいです。大体どういうことなのかは理解していると思います)。しかしながら…

C++0xの機能 (一様な初期化構文)

C++

今回は"Uniform initialization"(一様な初期化構文)。初期化のときにどのようなオブジェクトにも次のような構文 struct SampleA { int a; float b; }; struct SampleB { SampleB(int _a, float _b) : a(_a), b(_b) {} private: int a; float b; }; SampleA v…