2010-07-07

欲しいC++0x機能

現在、主要コンパイラは、C++0xの新機能を実装しだしている。まだ、不完全な実装が多いが、autoやdecltypeは、もうかなり使えるようになっているし、lambda expressionも、だいぶ実用的な実装が出ている。list initializationや、variadic templatesも、gccは実装を初めている。しかし、未だに主要コンパイラが実装していない機能で、是非とも使いたい機能がある。また、別に実装しなくてもいいのではと思う機能もある。まだ、主要なコンパイラが実装していない機能で、欲しい機能といらない機能を、メモがわりに書いておく。

まずは、MUST-HAVE機能から。

新しいtypedef記法である、alias-declaration。

// typedef int (*type[5])(int, int)と同じ
using type = int (*[5])(int, int)

コンストラクターを継承できる、inheriting constructors。

struct Base
{
    Base() ; Base(int) ; Base(int, int) ; Base(float) ; Base(std::string) ; Base(std::vector) ;
} ;

struct Derived : Base
{
    using Base::Base ;
} ;

派生クラスのコンストラクターでは特にすることがない場合でも、単に値を基本クラスに渡すためだけに、対応するコンストラクターをすべて書かなければならない。これは労力の無駄である。プログラマはえてして怠惰なものあるから、そのような状況に直面した場合、常にコピペを使う。間違いのもとである。コンストラクターを継承できる機能は当然だ。

コンストラクターをデリゲートできる機能。規格に公式な名前なし。

// 分数クラス
struct Fraction
{
    int num ; int denom ;
    // 分子、分母の引数を取るコンストラクター
    Fraction( int num, int denom ) : num(num), denom(denom) {/*実装*/}
    // 整数を取るコンストラクター
    Fraction( int value ) : Fraction( value, 1 ) {/*何もしなくてよい*/}
    // コピーコンストラクター
    Fraction( Fraction & right ) : Fraction( right.num, right.denom) {/*何もしなくてよい*/}
} ;

この分数クラスのコンストラクターは、引数を受けて、メンバー変数などを初期化するであろう。しかるに、クラスを使いやすくするため、単に整数を受け取り、分母を1とみなすコンストラクターを書きたい。このため、コンストラクターのデリゲートはできてしかるべきである。これだけならば、デフォルト引数でも済むが、コピーコンストラクターの場合もある。

わざわざ名前がないのは、これぐらいできて当然だからである。

いらない機能、user defined literals。

3 comments:

Anonymous said...

> コンストラクターをデリゲートできる機能。規格に公式な名前なし。

12.6.2 p6 より、 delegating constructor と呼ばれるようですよ。

江添亮 said...

まあ、普通に英語で言うとそうなるでしょうね。

Anonymous said...

ん?
斜体になっているので、用語(=公式な名前?)として定義されている、ということです。( 1.3 p2 参照)