Grammar

nonassignable

CopyConstructibleだがAssignable(operator=)はいらないというのは結構ある にこっそりあるが単独のヘッダでは使えないようなので・・・ソースコード []#include[] []<pstade/assignable.hpp>[] []#include[] []<pstade/nonassignable.hpp>[]</pstade/nonassignable.hpp></pstade/assignable.hpp>

属するコンテナを持たないイテレータのdereferenceについて

iterator_facadeはReferenceが参照型でない場合、IteratorCagegoryをInputIteratorに格下げする 参照でないとForwardIteratorの規定(24.1.3/1 の最後の行)を満たせないから ForwardIteratorのdereferenceは参照型でなくてはいけないから (24.1.3/1) RandomAc…

さよならnew

これを実装してみました・・・ソースコード VC++とGCCのみ対応ですが、どちらもちょっとずつおかしいので怪しい これをポータブルにするは大変だと思う []struct[] []A0[][] { [][]A0[][]() { } };[] []struct[] []A1[][] { [][]explicit[] []A1[][]([][]int…

Matafunctionのカスタマイズにenable_ifが使えた

タグディスパッチはいらなくなった、かもしれない・・・参照 []#include[] []<string>[] []#include[] []<boost/lexical_cast.hpp>[] []#include[] []<boost/type_traits/is_base_of.hpp>[] []#include[] []<boost/utility/enable_if.hpp>[]</boost/utility/enable_if.hpp></boost/type_traits/is_base_of.hpp></boost/lexical_cast.hpp></string>

const int 再び

const intを使うと、ODR違反が起きてしまう場合がある その条件が不明確のようだ・・・参照 標準にはアドレスが使用されないなら大丈夫と書いてある(3.2.5) boost::mpl::integral_cはODR違反の起きる前にそもそも定義がない・・・参照 というわけで、定義が…

Forwarding Problem 解決される

参照 []#include[] []<boost/detail/callable.hpp>[]</boost/detail/callable.hpp>

ios_base::Init

mainより前にstd::cout等を使う場合、ios_base::Initを使う前に定義する 実装について・・・参照 忘れる前に・・・ソースコード

&x + 1は有効なiteratorか

有効である・・・参照

dynamic initialization

ある種の静的なオブジェクトはmain関数の前に初期化されることは保証されていないらしい(標準の3.6.2の3) 実際には、 みんなやってきたので大丈夫 保証されてないと仮定すると矛盾が生じるので大丈夫 ということらしい・・・・・・参照 そこでヘッダに処理を…

ヘッダでは、メンバでないconst intは使えない

要するに、翻訳単位に局所的なオブジェクトは何であれ、templateから参照しては駄目らしい・・・参照 やっぱりBoost.Lambdaは違反しているらしい 対策は、 無名名前空間の参照でオブジェクトを捕まえる コンパイル時定数がほしいなら、staticメンバ変数を使…

新コンパイルタイム・ポリモーフィズム(Metafunctionが要る場合)

メンバあるいはtag dipatchを使ったカスタマイズ boost::result_ofのカスタマイズにtag dispatchを付けた形に近くなった 結局は、型と型とマッピングなので ADLは使わない Metafunctionをspecializeするために、どうしても名前空間を開くことになるから enum…

新コンパイルタイム・ポリモーフィズム(Metafunctionが要らない場合)

結局、Metafunctionが要る場合と要らない場合に分かれるのではないかと思う まずMetafunctionが要らない場合 メンバとADLを使ったカスタマイズを利用 tag dispatchと同じことはenable_ifで代用(overload型の存在価値が決定的に) 継承階層を利用したい場合は…

has_xxx

どうもいわゆるhas_xxxはprivateメンバには使えないらしい・・・参照

続コンパイルタイム・ポリモーフィズム

id:y-hamigaki:20060407に関連して 特に、Metafunctionのカスタマイズが必要ない場合、継承階層が働くように、デフォルトの動作(メンバ関数を呼び出す等)はない方が良いと思う 例えば、の一番上のboost_range_beginは、ある基底クラスがRangeとしてカスタマ…

Conversion Member Templateを使った戻り値型の指定の省略

一時的なクラスを用意して、戻り値の型の指定を省略できるようにする 使いどころが多くて面白いです・・・参照 xxx_castのような関数にも全部用意してはどうだろう・・・boost::lexical_castの場合 []#include[] []<pstade/lexical_cast.hpp>[]</pstade/lexical_cast.hpp>

ヌルポインタ

前に見つけたBoost.Nullですが、(たぶんコンパイラのバグで)全然動かない IntegralConstantにしようとも思いましたが、結局こうなった []#if[][] !defined(NULLPTR)[] []#define[][] NULLPTR 0[] []#endif[]

戻り値の型をテンプレート仮引数にする

Boost.Phoenix-2にEvalPolicyという概念があるんですが、戻り値の型がテンプレート仮引数になっている 戻り値の型をユーザーが書かなくてよくなる (ソースが劇的にすっきりする) ライブラリ側はこちらに注意 ちなみに以下のようなコードを本当に使っていた […

const限定するだけの関数

Boost.Lambdaにmake_constがあった もっと汎用的にhelp_rvalue_deductionというのがBoost.Phoenix-2にある こちらと関係あるのかもしれない Boost.Phoenix-2のドキュメントは分かりやすいです []#include[] []<boost/test/minimal.hpp>[] []#include[] []<boost/lambda/core.hpp>[] []// make_const[]</boost/lambda/core.hpp></boost/test/minimal.hpp>

コンパイルタイム・ポリモーフィズム完結編?

いままでの全部サポート Metafunctionが必要な場合、一貫性が取れないのでlayer1と2はいらないかもしれない Non virtual interfaceは重要だ(あとからどうにでもできる) []#include[] []<boost/test/minimal.hpp>[] []#include[] []<boost/type_traits.hpp>[] []#include[] []<iostream>[]</iostream></boost/type_traits.hpp></boost/test/minimal.hpp>

さよなら無名名前空間

どうも下の些細な変数は異なるcppで関数テンプレートから使用されるとODR違反になってしまうらしい・・・参照 参照 []namespace[][] { [][]int[] []x[][]; } [][]// unnamed namespace[] Boost.Bindのplaceholderも違反している?・・・参照 回避策・・・参照…

result_of

result_ofについて・・・参照 result_ofの利用者は大胆に型を訊ねて良い 実際にどのように引数を受け取るかは関数オブジェクトの実装者の自由 result_of::typeは常に成功し、デフォルト値(void)を持っている・・・参照 引数のない(つまりテンプレートでない)…

cstring_begin

いまboost::fixed_stringのレビューが行われている 古いAPIにバッファを渡す方法を考えてみた・・・ダウンロード ATL/WTLのCStringにも対応できる 参照 Effective STL Item16 (C++ 23.2.4.1) 一時オブジェクトの生存期間 []char[] []src[][][[][]21[][]] = […

ヘッダでusing-directiveを使う

using-declaration、typedef、Metafunction等で名前を持ってくる VC8では恐るべきバグがあるようだ []#include[] []<boost/config.hpp>[] []#include[] []<boost/detail/workaround.hpp>[]</boost/detail/workaround.hpp></boost/config.hpp>

プリプロセッサシンボルをMetafunctionにする

これは間違っているような気もするしマクロをなるべく避ける観点からは正しい気もする 個人的にはソースがきれいになったと感じた場合もあります []namespace[] []pstade[][] {[] []template[][]< [][]class[][] = [][]boost[][]::[][]mpl[][]::[][]void_[][…

Argument Dependent Lookup(ADL)についての情報

C++ Templates - The Complete Guide この本がなかったらと考えると怖い Boost.Serializationの存在も危うい?・・・参照 A Modest Proposal: Fixing ADL (revision 1) ADLの侵入先を狭める提案 ADLを引き起こした引数の型と位置が一致しない場合は候補にし…

crtp_cast

ATL/WTLではCRTPというテクニックを多用している これはtemplateを使ったTemplate Methodパターンである(ややこしい) static_castが使えるが意味が多すぎるので避けたい、そこで・・・ダウンロード キャストさえ面倒な人にはauto_derived []#include[] []<pstade/crtp_cast.hpp>[]</pstade/crtp_cast.hpp>

ADL Barrier

名前空間を限定しないで関数を呼び出すと、ADLが引き起こされて名前が衝突する可能性がある これは呼び出した側のバグであるが、標準ライブラリにもある GCCでは関数名とクラス名も衝突する・・・参照 完全な安全のためには、型は自分専用の名前空間にいなけ…

コンパイルタイム・ポリモーフィズム再び

Boost.Foreachが見せてくれた・・・参照 ADLのための関数はどうせフルネームなのだからグローバル名前空間を使えばいいということだ Boost.Foreachではenumを使っているが移植性の問題かもしれない 以下、eVC4, VC7, VC8, GCC3.4.4で動作確認 []#include[] []<string></string>…

使用されていない変数への警告を避ける方法

分からなかった boost::ignore_unused_variable_warningというのがあるが、使っていいのか不明 x;も警告の対象になっている・・・参照 Comeauだと(void)x;でも警告がでる void型へのキャストについて・・・参照 コンパイラによってまちまちのようだ というわ…

テンプレート引数を明示した関数の呼び出し

以下のコードがあいまいエラーになるのは正しいらしい(どうしてだろう) 明示的テンプレート引数の必要な転送関数ではBoost.EnableIfが必要になる 型だけを関数に渡すときは、boost::typeなどを使った方がいいかもしれない []template[][]< [][]class[] []Ex[…