C++ トークン連結演算子 書いて覚えるための初心者自己中記事
トークンはコード内で分割できない最小単位だったはず。
それを連結する・・?
なんだろう。
まず、
TYPEDEF_CONTAINERS(int, int);
こう書くと
typedef vector<int> VectorInt; typedef list<int> ListInt; typedef set<int> SetInt;
こう展開されるマクロを作りたいとする。
ポイントはオブジェクト名に型名が反映されるようにしたい点。
こうしてしまうと
#define TYPEDEF_CONTAINERS(TYPE, suffix) \ typedef vector<TYPE> Vectorsuffix; \ typedef list<TYPE> Listsuffix; \ typedef set<TYPE> Setsuffix;
suffixを含めたものが1つのトークンと認識されてしまう。
別のマクロと組み合わせてやっても、展開されるときは別トークンと認識されるので空白が勝手に入ってしまう。
#define TYPEDEF_CONTAINERS(TYPE, suffix) \ typedef vector<TYPE> Vector##suffix; \ typedef list<TYPE> List##suffix; \ typedef set<TYPE> Set##suffix;
こうすればいいのか。
で、引数を1つにしたい場合。
#define SUFFIX(type) SUFFIX_##type #define SUFFIX_int Int #define CONCAT_(a,b) a##b #define CONCAT(a,b) CONCAT_(a,b) #define TYPEDEF_CONTAINERS(type) \ typedef vector<type> CONCAT(Vector,SUFFIX(type)); \ typedef list<type> CONCAT(List,SUFFIX(type)); \ typedef set<type> CONCAT(Set,SUFFIX(type)); int main() { TYPEDEF_CONTAINERS(int); VectorInt v; system("pause"); }
ややこしいな。
用意したのはint型のだけ。
ここまで。