C++ ⇒ VBA 書いて覚えるための初心者自己中記事

C++ ⇒ VBA 勉強の履歴を付けるというかノート代わりに使ってます

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型のだけ。

ここまで。