Grammar

型がPODかどうかチェックする方法

boost::is_podはほとんどのコンパイラで動かないようだ 以下のようにすると少なくとも警告が出せる (Comeauやgccなど) Boost.Xpressiveが利用していると思われる inline void pod_check(...) {} struct A {}; struct B : A {}; inline void pod_check_of_AB(…

右結合のpipe

関数呼び出しのシンタックスは醜い f(g(h(x)) を f $ g $ h $ x の様な感じに書けるようにしたい これはpipableを逆にしただけなので、何か右結合のoperator overloadをこの実装に追加すればいい Pipableの概念に組み込むのがいいかもしれない これを使ってO…

any_ref

参照を何でも保持するany_ref (実装) boost::tuple<int, char, std::string> tup(1, 'a', "hello"); BOOST_FOREACH (any_ref a, oven::hetero<any_ref>(tup)) { if (a.type() == typeid(std::string)) { std::string &s = pstade::any_ref_cast<std::string>(a); s = "goodbye"; break; } } BOOST_CHECK( bo</std::string></any_ref></int,>…

static initialization vs ODR violation

まず、ODR violation対策のこれを参照 msvcは、上の_1を(optimizerがないと?)statically-initializeできない gccは、_1はstatically-initializeできるが、placeholder const *p_1 = &_1; のように使った場合、p_1をstatically-initializeできない 結局、sta…

POD指向プログラミング?

新しいプログラミングパラダイム、かもしれない オブジェクトを静的に作るために全部POD型にする Boost.XpressiveやBoost.Protoがその実践例と考えられる 実際的なメリットとしては、コンパイルが早くなる 初期化に関数を使わないから POD型はユーザー定義の…

Currying in C++

static-initializationのために苦しいマクロを使う羽目になる 8.5.1/14(Working Draft)はsubaggregateにも当てはまると思われるので型が複雑になると大変になる 実装とサンプル Quickbook1.4(Boost1.35相当)がかなりパワーアップしていた

二項関数をinfixにする

FC++にあって、実装は意外に簡単 実装とサンプル Haskellのマネであるらしい

noncopyableは駄目かもしれない

EBOが働かない場合があるらしい (参照) もう自分でprivate部を書く方が簡単だと思う

auto_ptrの仕様

auto_ptrはelement_typeが異なるものからはcopy-initializeできないようだ (参照) auto_ptrの初期化の表 Defect Report 84. user-defined conversionが二回必要なので駄目らしい [id:mb2sync:20060808]もコンパイルエラーになるべきだと思われる

型をAssignableにする方法

boost::optionalをresetしてからassignすればいいだけだった (実装)

static_downcast

static_castは何をしているか分からないので駄目である そこで実行時にチェックできる場合はチェックするdowncast (実装) VC++7.1のバグのおかげですごく苦労した cv-qualifierは自動なのがミソ []#include[] []<pstade/static_downcast.hpp>[] []#include[] []<boost/utility/result_of.hpp>[]</boost/utility/result_of.hpp></pstade/static_downcast.hpp>

make_array

boost::arrayをdirect-initializationする方法がないらしい (参照) make_arrayのようなものを作らないといけない Boost.Assignはassignするので少し遅くなる そこでinitializer-list(pdf)のようなもののエミュレートを試みた 実装とサンプル copy_range関数…

Auxiliary interfaces

Auxiliary class interfacesという提案(pdf)がある operator|を使って実装を試みる 引数がゼロ個の場合は本当に使っていいかもしれない []#include[] []<pstade/auxiliary.hpp>[] []#include[] []<boost/utility/result_of.hpp>[] []#include[] []<cstring>[]</cstring></boost/utility/result_of.hpp></pstade/auxiliary.hpp>

ヌルポインタ再び

なるほど (参照)

マクロに型を渡す

テンプレートを利用した型はコンマで区切られていることがあるので([id:Cryolite:20050326])を使うのだが、const修飾が消える (13.1/3) VC++7.1は消えないので注意 コンマを保護するマクロを呼ぶのはユーザの責任になる こうすればどうだろう (実装) affect…

あっても(なくても)いいtypename

The keyword typename shall only be applied to qualified names, but those names need not be dependent. (14.6/5) 上の文は、最新のDraftでは(typenameのルールを緩くするため?)削除されているようだ []struct[] []X[] []{[] []typedef[] []int[] []typ…

using declaration vs using directive

[id:uskz:20061111]を調べていて(たぶんVC++のバグ?)、こんなものを発見 「using directiveを含む名前空間とそのusing directiveの対象となる名前空間の両方を含んでいる最も内側で取り囲む名前空間の中で宣言されたように見える。」 (7.3.4/2)

template constructor vs copy-constructor part2

以下のコードはtest1でassertion failedとなる (2)は、'T=D'なので、暗黙に生成された(1)とのオーバーロード解決に勝利する test2では、(3)がB型にキャストすることによって(1)を優先するようにしているのでassertion failedにならない 何が問題かと言うと、…

std::distanceとReachable

std::distanceの結果が負になるようなことはあってはいけない ここの204 "or decrements"の意味が不明という話 iterator_facadeで使うdistance_toの引数はreachableとは限らないので注意

const-qualified function?

以下のコードで、(1)は不正 (8.3.5/4) GCC3.4とComeauではコンパイルできる 最新のDraftではconstは無視されるので合法になる?(参照) (2)は何が起こるべきなのか不明 VC++7.1/8とComeauではコンパイル出来る GCC3.4ではコンパイル出来たり出来なかったりす…

さよならauto_ptr?

std::auto_ptrとboost::scoped_ptrをまとめてDeprecatedにするunique_ptr(旧名move_ptr)の提案がある unique_ptrの実装 Boost.Interprocess(cvs)にも含まれていてなぜか実装が二つある どちらもちょっとずつ駄目らしく今のところauto_ptr/scoped_ptrは必要な…

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

とうとう答えにたどり着いた?かもしれません Metafunctionの要らない場合です []namespace[] []poost_extension[][] {[] []struct[] []hello[][] { };[][]}[]

template constructor vs copy-constructor

以下のコードはassertion failedとなる kはconst修飾されてないので、(2)が、(1)とのoverload解決に勝利する・・・参照 これが意図したものであることはまずないと思われるので(3)の定義を忘れないようにする コンパイラが暗黙に生成するcopy-constructorで…

mutableな一時オブジェクト

constでない参照は一時オブジェクトで初期化できない id:mb2sync:20060727が使えた to_streamはostream_iteratorと同じものです id:mb2sync:20060804のためにconst_castは使えないことに注意 []oven[][]::[][]copy[][]([] []file_range[][]<>([][]"x.txt"[][…

「PならばQ」の式

!P || Q これが読みづらい Qの遅延評価のために関数にできない P ? Q : true なるほど・・・vector_example.hpp

さよならassert

前回の続き 要するにassertは意味が多すぎるので名前をつけよう、ということだ バグ潰しのためなのか事前条件なのか分からないassertがよくある 結局こうなった・・・ソースコード postconditionがあるときのreturnがマクロになってしまった []#include[] []<pstade/contract.hpp></pstade/contract.hpp>…

Design by Contract (DbC)

こんなものが提案されていた(必見)・・・Proposal to add Contract Programming to C++ function-try-blockでなんとかする試み・・・ソースコード 標準準拠のはず、だが、これは今までで一番怪しい 結局コンストラクタでお手上げになってしまった postcondit…

bool_testable

bool_testableというのが、Boost.Operatorsにいったん追加されたあと程なく削除されている・・・昔のoperators.hpp 完全な実装は無理なのかもしれない いまのところこうなった・・・ソースコード 参考文献 The Safe Bool Idiom Another safe_bool alternativ…

VC7.1付属のSTLのauto_ptrのバグ

以下のコードのように、コピー(Move)するauto_ptrのelement_typeが異なるとoperator auto_ptr_ref()が無限に再帰してスタックがとぶ どうもauto_ptr_refのコピーコンストラクタを呼ぶために再びこれが呼ばれるようだ コンパイラのバグではなくSTLのバグと思…

Copyableでないといけない場合

ひっかかるのはまれであると思いますが、以下のコードはGCC3.4ではエラーになる・・・参照 draft October 2005では修正されているようだ []#include[] []<boost/noncopyable.hpp>[]</boost/noncopyable.hpp>