名前つきブロック
while はループにも名前を付けられるって事を示したかっただけで、コード上の意味は無い。named は冗長だからいらないかも。
template タイプ (またはエイリアス)
ただ別名が付けられるだけ。略したいなら using しろよってツッコミもアリ。
class の継承で実現可能だけど、コンストラクタとか operator とか隠滅されるから手軽には出来ない。マクロは namespace 使えないし論外。
動的なクラス名の保持
foo() {
named block1 {
while ( 1 ) named block2 {
exitfrom block1;
}
::std::cout << "never print" << ::std::endl;
}
}
template タイプ (またはエイリアス)
template< typename T > typedef ::std::vector< T > myVec;
class の継承で実現可能だけど、コンストラクタとか operator とか隠滅されるから手軽には出来ない。マクロは namespace 使えないし論外。
動的なクラス名の保持
Expression Template※ とかで、
みたいな計算式を書くと、template で動的に膨れ上がった、ツリー状のクラスが生成される。bind も同じ現象。
そのクラス名は不定のため、bar のクラス名を決定する事は出来ない。CBar のコンストラクタを
としたところで、T を保持しておく機構が無いので、bar を次の演算に使おうにも型が分らない。
boost の function を使っても、戻り値の型を決めてやらないといけない。次の演算にも ET を連結しようとすると、戻り値の型は function に渡した時の型そのものが必要になるので、やはり分らない。かといって ET の連結を諦めて、そこで ET を解決してしまうと、全要素の演算が発生するので ET の意味が半減する。
※Expression Template
CBar bar = (a + b * c) / 2;
そのクラス名は不定のため、bar のクラス名を決定する事は出来ない。CBar のコンストラクタを
template< class T > CBar( T value )
boost の function を使っても、戻り値の型を決めてやらないといけない。次の演算にも ET を連結しようとすると、戻り値の型は function に渡した時の型そのものが必要になるので、やはり分らない。かといって ET の連結を諦めて、そこで ET を解決してしまうと、全要素の演算が発生するので ET の意味が半減する。
※Expression Template
divide< add< mult > > みたいな感じで演算式を全てテンプレートに変換してしまう手法。
配列演算に用いてもテンポラリな配列を必要とせず、線形であれば同じ要素を 2 度読む事も無い。そして配列同士の演算の後、実際に使用するのがたかが数要素なのであれば、ET の解決時に使用する要素だけの演算になる。よって、よく配列演算の最適化に使われる。
配列演算に用いてもテンポラリな配列を必要とせず、線形であれば同じ要素を 2 度読む事も無い。そして配列同士の演算の後、実際に使用するのがたかが数要素なのであれば、ET の解決時に使用する要素だけの演算になる。よって、よく配列演算の最適化に使われる。