今まで、延々と規格を睨むだけだったが、そろそろ、実際にコードを書いて、自分の規格への理解を試すべきだと思い、gcc4.5のスナップショットを使った。
その結果、C++0x Support in GCCで、サポートしていると明言されていた機能は、ほぼすべて、理解通りになっていた。動かないコードは、"sorry, unimplemented:"と表示されるか、あるいは、gccのバグだと結論できた。
ちなみに、バグであるというのは、本の虫: gcc4.5がVariadic TemplateのDependant name resolutionに対応していないを参照されたい。
実装されていない機能というのは、Variadic Tempalte argumentsを、 fixed-length argument listに渡すこと。すなわち、
template < typename T, typename ... Args > struct Sizeof { static int const value = 1 + Sizeof<Args...>::value ; } ; template < typename T > struct Sizeof<T> { static int const value = 1 ; } ; template < typename ... Args > void f() { static_assert( sizeof...(Args) == Sizeof<Args...>::value, "fail") ; } int main() { f<int, int, int, int>() ; }
Sizeofメタ関数は、sizeof...と同じ働きをする。
No comments:
Post a Comment