2014-02-04-01-たまにはC++の話でも - project-enigma

2014-02-04-01-たまにはC++の話でも

>> Site top >> weblog >> 月別アーカイブ >> 2014年02月のlog >> 2014-02-04-01-たまにはC++の話でも

最終更新日付:2014/02/04 23:50:00


たまにはC++の話でも

2014 年 02 月 04 日

最近は Common Lisp ばかりなのだけれど、仕事でもプライベートでも C++ を時々使う。で、新しい C++ 標準をまだ実際に使っていないので、まだ色々と良くわからないことが多い。今回は、constexpr のことでも。

以前から使っている関数テンプレートに、countof というのがある。これは配列の要素数を取得するもので、自分が以前から使っている実装は以下のようなものだった。

template <int N, typename T>
inline int countof( T const (&arg)[N] ) {
    return N;
}

C であれば sizeof(arr) / sizeof(arr[0]) という慣用句でお馴染みのアレだ。まぁそれが countof( arr ) とかけるので気に入っている。気に入ってはいるのだが、これはsizeof と違って演算子ではない。だから以下のようには書けない。

int  arr1[10];
char arr2[countof(arr1)];

本当にそう書きたいのかと言われるかもしれないが、まぁ要するにコンパイル時定数としては扱えないという話だ。しかし、先の countof の実装を constexpr を使って以下のように変えると話は別だ。こいつが返す値はほぼ完全に定数値として振る舞う。これで countof 演算子のできあがりである。

template <int N, typename T> 
inline constexpr int countof( T const (&arg)[N] ) { 
    return N; 
} 

あと、良く見かける階乗計算の例。C++ 0x11 以前では class か struct を使って、public な static const int メンバを使うのが常道だった。しかし、constexpr を使えば関数テンプレートにしてしまえる。

template <unsigned int V> 
inline constexpr int Factorial() { 
    return V * Factorial<V-1>(); 
} 
template <> 
inline constexpr int Factorial<0U>() { 
    return 1; 
} 

まぁメタプログラミングには従来の方式を使って、実行時計算で関数を使うという方がわかりやすくて良いのかもしれないけれど、いずれにせよ constexpr はメタプログラミングに大きく寄与すると思った。地味かもしれないけれど、これは C++ 0x11 の中でも画期的なものではないかと思う。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : C/C++

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.