次のメタ関数は、ASCII 図形文字に対応する ASCII 制御文字コードを返します。
0 1 2 3 4 5 6 |
template <int C> struct ctrl { static const char value = C ^ 0x40; }; |
これだけでも構わないのですが、有効なCの値の範囲は0x3fから0x5fまでです。C++11以降であれば、static_assertを使ってエラーチェックを行った方がよいと思います。C++03までであれば、Boost C++ LibrariesのBOOST_STATIC_ASSERTを使うとよいでしょう。
せっかくですので関数版も作ってみましょう。
0 1 2 3 4 5 6 7 |
template <typename T> T ctrl(T c) { assert(0x3f <= c && c <= 0x5f); return c ^ 0x40; } |
一応、char型以外にもwchar_t型、char16_t型、char32_t型、char8_t型も使えるようにテンプレートにしましたが、単なる整数値を扱うだけなのでint型でもいいかもしれません。
また、今回のメタ関数や関数が通用するのはASCIIやISO 646互換の文字コードだけです。より安全にするには、あらかじめ定義されたマクロ__STDC_ISO_10646__が定義されていることを#ifdefで判定するようにした方がよいでしょう。