C++
tuple_n<int,3>でtuple<int,int,int>になる型エイリアス http://melpon.org/wandbox/permlink/2WpxZNuDV1qNTrX2 使い所不明です</int,int,int></int,3>
std::map<T,U&> 知らなかった http://melpon.org/wandbox/permlink/0DxxCiaJpUKWw9nJ</t,u&>
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>…
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>…
その1はどこ? その1(auto-delete)に関しては私が書く必要がないので省略する 本題 動的ポリモーフィズムをするときに役立つ特性を持っています 生ポインタで動的ポリモーフィズムするときにめんどくさい事 struct Base{}; struct Derived : Base {}; int…
メモ http://melpon.org/wandbox/permlink/E4zsyZ3fo2p9VBYq
部分特殊化したときの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>…
現在トークンを任意の座標に配置するプログラムを生成しています ふとランダムに配置する関数も評価用に必要かな?と思いましたので 標準ライブラリにある<random>を使ってみようと思います 乱数 rondom_deviceクラスの変数を宣言すると勝手に乱数が出来上がっている</random>…
前の記事で=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>…
さっきまで嵌っていたのですが constメンバを含む関数で代入演算子を=defaultで自動実装させた場合 勝手に=deleteになってしまうようです 良く考えれば、constメンバに代入する事ができないため、妥当な処理なのですが しばらく気が付きませんでした・・・・…
テンプレートクラスを作成し、その演算子などを非メンバ関数で定義する場合 往々にして、friend関数にする場合が多いと思います これが厄介で、まずテンプレートクラスの前方宣言をします その後にテンプレート関数として目的のfriend関数を前方宣言します …
せっかくなのでconstexpr対応しつつ、ちょこちょこ書いてます クラスを設計する事より、constexprを学ぶ事がメイン(本末転倒) 進捗その1 http://melpon.org/wandbox/permlink/Rnq8D2etXIvLfmfx 進捗その2 http://melpon.org/wandbox/permlink/RLVRvHYCfS…
普通のクラス設計でpublicメンバ変数は定義しないと思いますが 座標系のクラスを作っているときにいちいちgetterから呼び出すのに 変な違和感を覚えます readonlyなpublicメンバが欲しいです C#ではpublic readonly int x;とかpublic int x{get; private set…
前にpush_backで作った奴のemplace版です テスト項目を増やしました http://melpon.org/wandbox/permlink/76HSVvDSWz8lhG2U 追記:dictのTがchar*の引数コンストラクタを持っている場合に対応しました http://melpon.org/wandbox/permlink/oHlbOyB12ItmOVz6 …
昔、constexpr文字列を使ったときと同様のノリで static constexprメンバ変数として数字配列を作成したらリンクエラーがでました class Hoge{ public: static constexpr auto array = {1,2,3,4}; // Error static constexpr auto word = (char*)"hoge"; // O…
Variadic TemplateをつかったSTLのTemplate Template parameter イディオム 後ついでにmember関数の有無をチェックするヘルパクラスを使ったSFINAE http://melpon.org/wandbox/permlink/usQueFzSHaHzzzLN ↓ declval() → T() の方がコンパイル時間が早い? ht…
返り値型が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>…
やり方 is_constructibleを使えばよかったようです http://melpon.org/wandbox/permlink/HmXdOTNXMO53kIUy
テンプレーメタプログラミング(TMP)というものをC++においてよく見かけます 私の理解が曖昧なので、とりあえずまとめることにします 前提知識として 関数のオーバーロード C言語とC++の言語使用の違いの例として、よく「同一の名前を持つ関数を複数定義で…
generic lambdaがすごく便利ですね ファンクタの定義はTemplateを使うか、lambdaを使うかの2択で 前者はメンバ関数内では使用できないし、 後者は引数の型を明示しなくてはならないため、 foreachなどのコンテナアルゴリズムを使う場合は Template引数毎に同…
BOOST_FOREACHでは使用できたのですが forではerrorになりました C++14以降では対応してくれるのかな? やはりできないらしい 参考:http://d.hatena.ne.jp/gintenlabo/20110122/1295714441
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_);} }; では使用することができません かとい…
std::mapのinsert関数では上書きができない に嵌っていました(ちゃんと仕様書よめ) 特定のkeyに対応するvalueを変更したい場合は operator[]の戻り値に代入する
http://ideone.com/ggg8bp