C++

tuple<typename T, int N>

C++

tuple_n<int,3>でtuple<int,int,int>になる型エイリアス http://melpon.org/wandbox/permlink/2WpxZNuDV1qNTrX2 使い所不明です</int,int,int></int,3>

map<T,U&>で参照型コンテナ

C++

std::map<T,U&> 知らなかった http://melpon.org/wandbox/permlink/0DxxCiaJpUKWw9nJ</t,u&>

Class Templateでの型推論

C++

function templateの型推論 function templateでは関数呼び出し時の引数によって型が推論されます template<typename T> T pow(T a,T b) return (b!=1) ? a : pow(a*a,b-1); } main(){ int a=3,b=3 pow(a,b); //pow<int>と推論される } class templateの型推論できない? 一方</int></typename>…

typeid().name()の出力

C++

g++ではtype_info::name()で出力される 型名が人類には早すぎる文字列で出力されています #include<iostream> #include<typeinfo> int main(){ std::cout << typeid([](int)->int{}).name() << std::endl; // 型直接渡してもよい std::cout << typeid(int).name() << std::endl; </typeinfo></iostream>…

shared_ptrの便利なところその2

C++

その1はどこ? その1(auto-delete)に関しては私が書く必要がないので省略する 本題 動的ポリモーフィズムをするときに役立つ特性を持っています 生ポインタで動的ポリモーフィズムするときにめんどくさい事 struct Base{}; struct Derived : Base {}; int…

Default template parameter を含んだ場合の class template の部分特殊化

C++

メモ http://melpon.org/wandbox/permlink/E4zsyZ3fo2p9VBYq

クラステンプレートの部分特殊化

C++

部分特殊化したときのtypename Tは何型なのか? // template<typename T> class A { vector<T> v_; }; // 引数がポインタの場合 template<typename T> class A<T*> { vector<T*> v_; }; // 引数がT constの場合 template<typename T> class A<T const> { //vecotr<T const> v_ // これはill-formed vector<T> v_; }; int main() { A<int></int></t></t></t></typename></t*></t*></typename></t></typename>…

乱数

C++

現在トークンを任意の座標に配置するプログラムを生成しています ふとランダムに配置する関数も評価用に必要かな?と思いましたので 標準ライブラリにある<random>を使ってみようと思います 乱数 rondom_deviceクラスの変数を宣言すると勝手に乱数が出来上がっている</random>…

代入演算子のconstexpr

C++

前の記事で=defaultでかってにimmutableクラスになる例を挙げましたが もちろん自分でoperator=関数を実装すれば、mutable関数にする事ができます #include <iostream> #include <utility> struct A { const int a_; A():a_(0){}; constexpr A(int a):a_(a){} ~A()=default; A(c</utility></iostream>…

代入演算子の=defaultが=deleteになるケース

C++

さっきまで嵌っていたのですが constメンバを含む関数で代入演算子を=defaultで自動実装させた場合 勝手に=deleteになってしまうようです 良く考えれば、constメンバに代入する事ができないため、妥当な処理なのですが しばらく気が付きませんでした・・・・…

template classのfriend関数をクラス内部で実装する

C++

テンプレートクラスを作成し、その演算子などを非メンバ関数で定義する場合 往々にして、friend関数にする場合が多いと思います これが厄介で、まずテンプレートクラスの前方宣言をします その後にテンプレート関数として目的のfriend関数を前方宣言します …

座標系のオレオレクラスを作成中(1)

C++

せっかくなのでconstexpr対応しつつ、ちょこちょこ書いてます クラスを設計する事より、constexprを学ぶ事がメイン(本末転倒) 進捗その1 http://melpon.org/wandbox/permlink/Rnq8D2etXIvLfmfx 進捗その2 http://melpon.org/wandbox/permlink/RLVRvHYCfS…

readonlyなpublicメンバ変数

C++

普通のクラス設計でpublicメンバ変数は定義しないと思いますが 座標系のクラスを作っているときにいちいちgetterから呼び出すのに 変な違和感を覚えます readonlyなpublicメンバが欲しいです C#ではpublic readonly int x;とかpublic int x{get; private set…

Keyが文字列なオレオレmapラッパでemplace

C++

前にpush_backで作った奴のemplace版です テスト項目を増やしました http://melpon.org/wandbox/permlink/76HSVvDSWz8lhG2U 追記:dictのTがchar*の引数コンストラクタを持っている場合に対応しました http://melpon.org/wandbox/permlink/oHlbOyB12ItmOVz6 …

constexprの実体化?

C++

昔、constexpr文字列を使ったときと同様のノリで static constexprメンバ変数として数字配列を作成したらリンクエラーがでました class Hoge{ public: static constexpr auto array = {1,2,3,4}; // Error static constexpr auto word = (char*)"hoge"; // O…

TMPいろいろ試してみた

C++

Variadic TemplateをつかったSTLのTemplate Template parameter イディオム 後ついでにmember関数の有無をチェックするヘルパクラスを使ったSFINAE http://melpon.org/wandbox/permlink/usQueFzSHaHzzzLN ↓ declval() → T() の方がコンパイル時間が早い? ht…

TMPの条件分岐を記載する場所

C++

返り値型がvoid型 template<typename T> typename enable_if< /*条件式*/>::type func(T t) { } template<typename T> typename enable_if::type func(T t) { } 返り値型が引数型に依存 その(1) template<typename T> typename enable_if< /*条件式*/,T>::type func(T t) { } template<typename T> typename</typename></typename></typename></typename>…

コンテナの内部型が特定のコンストラクタを所有しているか否かで関数のオーバーロード分岐(SFINAE)

C++

やり方 is_constructibleを使えばよかったようです http://melpon.org/wandbox/permlink/HmXdOTNXMO53kIUy

TMPわからん

C++

テンプレーメタプログラミング(TMP)というものをC++においてよく見かけます 私の理解が曖昧なので、とりあえずまとめることにします 前提知識として 関数のオーバーロード C言語とC++の言語使用の違いの例として、よく「同一の名前を持つ関数を複数定義で…

C++14の汎用lambda

C++

generic lambdaがすごく便利ですね ファンクタの定義はTemplateを使うか、lambdaを使うかの2択で 前者はメンバ関数内では使用できないし、 後者は引数の型を明示しなくてはならないため、 foreachなどのコンテナアルゴリズムを使う場合は Template引数毎に同…

equal_rangeでrange based for loop が使えなかった

C++

BOOST_FOREACHでは使用できたのですが forではerrorになりました C++14以降では対応してくれるのかな? やはりできないらしい 参考:http://d.hatena.ne.jp/gintenlabo/20110122/1295714441

headerファイルに文字列定数(string編)

C++

struct { static const char* foo = (char*)"foo"; } とても便利なのですが, class T{ private: U* u_; static const char* foo = (char*)"foo"; public: const string& get_u{return (u_==nullptr)?(foo):(*u_);} }; では使用することができません かとい…

mapのinsert

C++

std::mapのinsert関数では上書きができない に嵌っていました(ちゃんと仕様書よめ) 特定のkeyに対応するvalueを変更したい場合は operator[]の戻り値に代入する

ポインタ変数のdefault ctorはnullptr

C++

http://ideone.com/ggg8bp