template< int N > struct int_{ static int const value = N; }; int_< 1 > _1; int_< 2 > _2; int_< 3 > _3; template< class LHS, class RHS > int_< LHS::value + RHS::value > operator+( LHS, RHS ); template< class LHS, class RHS > int_< LHS::value * RHS::value > operator*( LHS, RHS ); decltype( _1 + _2 + _3 ) _6; decltype( _6 * _2 ) _12; typedef decltype( _12 ) _12t; static_assert( _12t::value == 12, "error" );
GCC 4.3 の最新 snapshot で -std=c++0x 付けたら通る.
http://d.hatena.ne.jp/Cryolite/20041209#p7 を思い出し,むしゃくしゃしてやった. infix で書くことができれば何でも良かった.今も反省していない.