#include <vector>
#include <algorithm>
#include "klx/all.hpp"
using namespace std;
using namespace klx;
// compile time binary constant
enum Flag {
Abc = _0b(0001),
Def = _0b(0010),
Ghi = _0b(0100),
Jkl = _0b(1000),
};
void push_1_and_2( vector<int>& v )
{
// scope guard
v.push_back( 1 );
ON_EXCEPTION( &vector<int>::pop_back, v );
v.push_back( 2 );
// when 2nd push_back raises an exception,
// v.pop_back() will be automatically invoked
}
int main()
{
// safe lengthof
char ar[] = "hello!"
;
char* ptr = ar;
size_t n = lengthof(ar);
// lengthof(ptr); <-- compile error!
// std container initializer
vector<int> nums;
init_v(nums) = 2, 3, 5, 7, 11, 13, 17, 19, 23;
push_1_and_2( nums );
// implicitly typed functors
sort( nums.begin(), nums.end(), kgreater() );
// no greater<int>()
}
ScopeGuardはAndrei Alexandrescu氏とPetru Marginean氏による記事を読んで 自分で実装してみた習作みたいなものです。例外発生時のみ発動、 という機能を付け加えたあたりが少しだけ新しいつもりではいますが。
2進定数はflipCodeでの記事を見て実装してみたもの。
lengthof、はよくあるテクニックです。
コンテナ初期化、は InitUtil を見て、 これって同じ事が演算子オーバーロードで出来るだろ、と思って作ってみたものです。 Thorsten Ottosen氏による多分私のよりもっといい実装が出現しています。
多相型関数オブジェクト、は他で見たことは今のところないのですが、 何か問題があって誰も使っていないだけなのかもしれません。
我ながらオリジナリティに欠けるなぁ。