C++

スマートポインタ(shared_ptr)に対する共変(covariant)戻り型のメモ

C++

頭出し 共変(covariant)戻り値について。 これを知らないと、たとえばオブジェクトのコピーを作成するcloneメソッドは以下のように書いてしまうわけですが、 これやっちゃうと、clone後、処理によってはいちいち基底型をdynamic_castして、NULLチェックして…

SFINAE(Substitution Failure Is Not An Error)のメモ

C++

関数のオーバーロードを使用する際に、うまくコンパイルできないケースをエラーとするのではなく、オーバーロードの対象から自ずと外してしまうという技法((技法というよりもコンパイラとしてこのような動作となるか否かって話っぽい))。以下の例の場合はte…

CRTP(Curiously Recurring Template Pattern)を使ってCloneable(Deep copy)を楽に書く方法を考えていた

C++

問題 オブジェクトの深いコピーを作る時は、コピーコンストラクタを内部で呼び出してnewするようなclone関数を作成するのがセオリーだと思い、以下のように書くわけです。 #include <iostream> //適当なクラス class Hoge { public: Hoge* clone(){return new Hoge(*th</iostream>…

「文字⇒数値」はatofでいいわ

C++

sstreamのstringstream使えばいいんだろうけど、こっちの方がタイプ量的に楽。 あとはboost::lexical_cast使えないちゃんの時のために。 #include <iostream> #include <vector> #include <algorithm> //文字列⇒小数の変換ファンクタ struct ToDouble{double operator()(std::string x){re</algorithm></vector></iostream>…

RcppでHello, world!

R C++

特に意味があるわけではないけれども、こんな感じか*1。 library(inline) src <- ' Rcpp::Rcout << "Hello, world" << std::endl; ' f <- cxxfunction(signature(), src, plugin="Rcpp") f() 実行結果 > f() Hello, world NULL 参考 Using Rcout for output …

テンプレートで書くか継承で書くか

C++

「数値計算をC++っぽく書く場合、速度的な事を考えるといちいち仮想関数テーブルを漁りにいかないのでテンプレートの方が速いんだろうな」と思っていたが、例のごとく億劫がってやってなかったので、やってみましたよというお話。結論としてはテンプレートを…

コンテナの要素を消去する際の選択

C++

これもまた良く忘れるのでメモ。 以下のようにチョイスするのが効率的。 連続メモリコンテナ系(vector, deque, string etc):erase + remove リスト(list):remove 連想コンテナ系(set, map etc):erase 以下例、「1,2,3,3,5」という要素を格納する各コン…

スワップ技法で確保した容量を削減

C++

STLのvectorにおいて一度reserveされてしまった容量(not サイズ)を削除するための技法。 単純にreserveを再度実行しても要領は削減されないので - std::vector(x).swap(x) と書く。 #include <iostream> #include <vector> int main() { std::vector<int> x; for(int i = 0; i < 1</int></vector></iostream>…

std::uniqueするときはsortを忘れないこと

C++

std::uniqueするときはstd::sotrしてからじゃないと正しくならない点に注意せんといかん。unique_copyでも似たようなコード書ける。 #include <iostream> #include <algorithm> #include <vector> int main () { std::vector<int> v; v.push_back(0); v.push_back(1); v.push_back(2); v.push_b</int></vector></algorithm></iostream>…

アライメントの調整を楽にする

C++

構造体をVBA(Excel)からC++に投げつける際には、データのメモリへの詰め込まれ方、アライメント(VC++デフォルト8バイト・VBA4バイト)に注意せんといかんわけです。 これを成し遂げるために今までは【プロジェクトのプロパティ】→【C/C++】→【コード生成…

vectorの配列番号をメモったまま(部分的に)並び変える

C++

昇順・降順ともに一旦ベクトルの値をindex-valueでペア化して、それをソート(ここではpartial_sort)するような関数(ここではlessPair, greaterPair)を用意すればOK。 ここではベクターの上位二番目の位までを降順並び替え。 #include <vector> #include <algorithm> #includ</algorithm></vector>…

STL vectorをRcpp::NumericMatrixのある列(行)に代入したい

R C++

生のstl vectorをNumericMatrixに突っ込もうとすると怒られた、一方、一旦Rcpp::NumericVectorを経由させたらイケた。 以下、サンプル。行・列ごとの代入もラクラクで便利。 library(Rcpp) library(inline) src <- ' std::vector<int> x(2,111); NumericMatrix xx</int>…

vectorの指定したiteratorの要素番号を取得する

C++

これも良く忘れるのでメモん。例えば最大の要素自体はmax_elementで取得できるんだけど、それのindex番号が欲しい時の書き方。iteratorの初めとのdistanceを取ればよい。別に最大要素のiteratorじゃなくても良くて適当なiteratorとのdistanceしてやればいい…

文字列を全て大文字(小文字)に変換したい

C++

時折ド忘れするのでメモ。 要するにtransform + toupper(tolower)の組み合わせが一番楽に出来るぞと。 #include <iostream> #include <string> #include <algorithm> int main() { std::string x("abCdef"); std::transform(x.begin(), x.end(), x.begin(), ::toupper); std::cout << x; r</algorithm></string></iostream>…

関数やクラスのメソッド中に、ローカルにクラスを定義できるってのを知った

C++

クラスの中にクラスを書けることはpimlなんかを通じて知っていたのだが、関数の中にもローカルにクラスを定義出来ることは知らなかったのでメモ。ファンクタとか使うのに便利そう。 #include<iostream> void hoge() { class Hoge { public: void Shout(){std::cout << </iostream>…

タグ・ディスパッチ(tag dispatch)とトレイツ(traits)

C++

ふつーにテンプレート使って型に応じた処理をオブジェクト指向っぽく書くと、静的にポリモーフィズムれるんだけど、そのほかにも掲題の「タグ・ディスパッチ」って手法もあるらしい。 タグ付けして処理をグルーピングさせるために使うイメージ。有名所だとST…

RStudioでRcpp使えるようになっとった

R C++

基本 RStudio and Rcpp | RStudio Blog を見ればよろしい。 私は環境を更新するついでに、Rに関して一旦全部更地にしてから行った(windows7 64bit)。 まずR本体・Rtools(C++のコンパイラとかが入っている)・RStudioそれぞれを以下よりインストール R本体(2…

同名で返り値のみ異なる関数を作成する

C++

普通にやると出来ない。回避策は二つ templateの特殊化 クラスの変換演算子 #include <iostream> #include <string> using namespace std; //templateの特殊化で対応 template <class T> T SameTypeReturn(); template <> double SameTypeReturn(){return 4.4;} template <> string Same</class></string></iostream>…

各コンテナ要素の『平均・分散・標準偏差』を計算するコード

たまに必要になるんだけど、毎回書き直しているのでメモっておく。 テストコードの結果はR言語と揃ってるのは確認済。 #include <iostream> #include <cmath> #include <vector> #include <list> #include <numeric> template <template<class T, class Allocator = std::allocator<T> > class Container> double mean(Container<double> & x) { return std::accumula</double></template<class></numeric></list></vector></cmath></iostream>…

(参照 | 値)を返す関数からの戻り値を(参照 | 値)型で受け取るときにコピーコンストラクタが発動するか否かの表

C++

ポインタだと混乱しないけど、参照だとよく頭がごっちゃになるのでメモっとく。 受取/関数 値返し 参照返し 値 ○ ○ 参照 ○ × (コピーコンストラクタが発動するケース○・しないケース×) 結局オブジェクトのコピーを作りたくないときは”参照戻し”の関数から…

Interpreter パターン

Interpreter pattern - Wikipedia DSL(Domain Specific Lanuage、ドメイン特化言語)を作るときに良いっぽい。要するにAST(Abstract Syntax Tree)を作るときに使うイメージかな?以下のコードは例の如くwikipediaにあったコードをC++に書きなおしたもの。サ…

Expression Template(式テンプレート)を使って、遅延評価を実現する

C++

式構造自体を保存し、必要な際に評価するための枠組み。「Expression Template」でググると色々例が出てくるが、大体行列・ベクトルを扱ったものばかりなので、がんばって”スカラー”評価をする用のクラスを書いてみた。正しくなさげ・最適化の余地ありだと思…

型変換演算子を使って、戻り値の型によるオーバーロードを実現する

C++

型変換演算子を使うとC++の言語使用でサポートされていない「戻り値の型によるオーバーロード」を実現することができる。以下のコードではstruct X内にA・Bの両型での型変換演算子を用意しているのがミソ。 #include<iostream> using namespace std; //戻り値の型 stru</iostream>…

型変換演算子を使って、特定の型へのキャストを行う

C++

型変換演算子(Type conversion operator)をオーバーロードして特定の型へのキャストを実現できる。以下では適当に作ったPointer(ポインタ)型クラスのオブジェクトをNULLポインタのときにfalseが返るようにbool型へキャストしている。 #include<iostream> using name</iostream>…

CRTP(Curiously recurring template pattern)を使って静的に多態性を実現する

C++

templateを使って静的に(コンパイル時に)仮想関数の仕組みを提供させようというもの。これを使うと仮想関数を呼びだすオーバーヘッドがなくなるので良いらしい。基本クラス(Base)をTemplateクラスとして宣言しておいて、派生クラスで自身を指定するのがミ…

Type Erasure(型消去)を使って何でも格納できる型を作成する

C++

要するにVBAでいうVariant型的な物をC++でどう作るのかというお話。この問題に対する設計の定石としては以下のようなクラスを設計することで対応する。 今回は”代入できる”という機能だけ作成。ここにtemplateで指定した型が持つべき関数を規定・制限したり…

テンプレートを使ったポリシー(Policy)による処理の切り替え

C++

コンパイル時に処理を切り替えたい場合に使用。Strategyパターンでは継承により処理を切り替えるが、こちらはテンプレートパラメーターで処理を切り替える。以下のサンプルコードは上述のLINK先のStrategyパターンのをもじって書いた。複数の特徴(戦略)を…

再帰テンプレートでべき乗を計算

C++

タイトル通り、templateを再帰的に使用することで関数チックな動作をさせる。0の場合を特殊化することで計算をうまく終了させている。また2つのtemplate引数がある場合の特殊化の書き方も覚えておきたい。 #include<iostream> using namespace std; //べき乗を計算 t</iostream>…

パラメータ化継承

C++

テンプレート引数で基本クラスを指定する手法らしい。発想としてはデコレーターパターンに近いような気がする。ここでは文字列の出力を太字・イタリック・あるいはその合成に指定できるようなサンプルコードを書く。 #include <string> #include<iostream> using namespace std</iostream></string>…

配列の要素数・最終要素を返す関数

C++

C++のテンプレートに関する本を斜め読みしているので、面白そうな奴だけでもまとめておこうと。 配列の要素数を返す関数 配列の最終要素を返す関数 を作成する。template引数に整数値を使用できるというところがポイント。 #include<iostream> using namespace std; //</iostream>…