কারণ কোণ বন্ধনী এছাড়াও প্রতিনিধিত্ব (অথবা ঘটতে) করতে পারেন তুলনা অপারেটরদের <
, >
, <=
এবং >=
, ম্যাক্রো সম্প্রসারণ কোণ বন্ধনী ভিতরে কমা উপেক্ষা করতে পারেন না মত প্রথম বন্ধনী মধ্যে আছে। (এটি বর্গক্ষেত্র বন্ধনী এবং ধনুর্বন্ধনীগুলির জন্যও সমস্যা, যদিও এটি সাধারণত ভারসাম্যযুক্ত জোড় হিসাবে দেখা দেয়)) আপনি ম্যাক্রো যুক্তিটি বন্ধনীতে বন্ধ করতে পারেন:
FOO((std::map<int, int>), map_var);
এর পরে সমস্যাটি হ'ল প্যারামিটারটি ম্যাক্রো প্রসারণের অভ্যন্তরে প্রথম বন্ধনীরূপে থেকে যায় যা এটি বেশিরভাগ প্রসঙ্গে একটি প্রকার হিসাবে পড়তে বাধা দেয়।
এটি কার্যকর করার জন্য একটি দুর্দান্ত কৌশলটি হ'ল সি ++ তে আপনি কোনও ফাংশনের প্রকারটি ব্যবহার করে একটি প্রথম বন্ধনযুক্ত টাইপের নাম থেকে টাইপনেমটি বের করতে পারেন:
template<typename T> struct argument_type;
template<typename T, typename U> struct argument_type<T(U)> { typedef U type; };
#define FOO(t,name) argument_type<void(t)>::type name
FOO((std::map<int, int>), map_var);
ফাংশন ধরণের গঠনের ফলে অতিরিক্ত বন্ধনী অগ্রাহ্য করা হওয়ায় আপনি এই ম্যাক্রোটি বন্ধনীর সাথে বা ছাড়াই ব্যবহার করতে পারেন যেখানে টাইপের নামটিতে কমা অন্তর্ভুক্ত নয়:
FOO((int), int_var);
FOO(int, int_var2);
সিতে অবশ্যই এটি প্রয়োজনীয় নয় কারণ প্রকারের নামের মধ্যে প্রথম বন্ধনীর বাইরে কমা থাকতে পারে না। সুতরাং, ক্রস-ল্যাঙ্গুয়েজ ম্যাক্রোর জন্য আপনি লিখতে পারেন:
#ifdef __cplusplus__
template<typename T> struct argument_type;
template<typename T, typename U> struct argument_type<T(U)> { typedef U type; };
#define FOO(t,name) argument_type<void(t)>::type name
#else
#define FOO(t,name) t name
#endif