C++ティプス

配列の要素数を返すマクロ

#define count(array) (sizeof(array) / sizeof(array[0]))

利用例:

short a[128];
printf("count: %u\n", count(a));

CかC++のどちらでコンパイルされたかを判別するマクロ

#ifdef __cplusplus
#define is_cpp true
#else
#define is_cpp 0
#endif

あるいは:

#define is_cpp (sizeof(char) == sizeof('A'))

プリプロセッサでincludeパスの簡略化

#define FOO_BASE_DIR c:/usr/include/foo/
#define FOO_PP_IDENTITY(x) x
#define FOO_PP_STRINGIZE(x) FOO_PP_STRINGIZE_I(x)
#define FOO_PP_STRINGIZE_I(x) #x
#define FOO_INCLUDE(x) FOO_PP_STRINGIZE(FOO_PP_IDENTITY(FOO_BASE_DIR)x)

利用例:

#include FOO_INCLUDE(bar.hpp)

この例ではc:/usr/include/foo/bar.hppがincludeされる。

ファイルの内容をstd::stringに一気に読み込む

std::ifstream ifs("hoge");
std::istreambuf_iterator<char> first(ifs);
std::istreambuf_iterator<char> last;
std::string data(first, last);

1行にまとめるときは括弧が必要(『Effective STL』第6項参照):

std::ifstream ifs("hoge");
std::string data((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());