هل هناك طريقة جيدة للجمع بين المتلاعبين؟
سؤال
إذا كنت أرغب في إخراج رقم سداسي عرض ثابت مع 4 أرقام على دفق ، فسأحتاج إلى القيام بشيء مثل هذا:
cout << "0x" << hex << setw(4) << setfill('0') << 0xABC;
الذي يبدو طويلًا بعض الشيء. يساعد استخدام الماكرو:
#define HEX(n) "0x" << hex << setw(n) << setfill('0')
cout << HEX(4) << 0xABC;
هل هناك طريقة أفضل للجمع بين المتلاعبين؟
المحلول
تجنب وحدات الماكرو عندما تستطيع! إنهم يخفيون الكود ، ويجعلون الأمور صعبة التصحيح ، ولا تحترم النطاق ، إلخ.
يمكنك استخدام وظيفة بسيطة كما قدمت Kene. إذا كنت ترغب في الحصول على كل ما يتوهم ومرونة ، فيمكنك كتابة المعالج الخاص بك:
#include <iostream>
#include <iomanip>
using namespace std;
ostream& hex4(ostream& out)
{
return out << "0x" << hex << setw(4) << setfill('0');
}
int main()
{
cout << hex4 << 123 << endl;
}
هذا يجعلها أكثر عمومية. السبب في أنه يمكن استخدام الوظيفة أعلاه هو بسبب operator<<
تم تحميله بالفعل مثل هذا: ostream& operator<<(ostream&, ostream& (*funtion_ptr)(ostream&))
. endl
ويتم تنفيذ بعض المتلاعبين الآخرين مثل هذا.
إذا كنت ترغب في السماح بتحديد عدد الأرقام في وقت التشغيل ، فيمكننا استخدام فئة:
#include <iostream>
#include <iomanip>
using namespace std;
struct formatted_hex
{
unsigned int n;
explicit formatted_hex(unsigned int in): n(in) {}
};
ostream& operator<<(ostream& out, const formatted_hex& fh)
{
return out << "0x" << hex << setw(fh.n) << setfill('0');
}
int main()
{
cout << formatted_hex(4) << 123 << endl;
}
إذا كان من الممكن تحديد الحجم في وقت الترجمة ، فقد تستخدم أيضًا قالب الوظيفة [بفضل Jon Purdy لهذا الاقتراح]:
template <unsigned int N>
ostream& formatted_hex(ostream& out)
{
return out << "0x" << hex << setw(N) << setfill('0');
}
int main()
{
cout << formatted_hex<4> << 123 << endl;
}
نصائح أخرى
لماذا الماكرو - ألا يمكنك استخدام وظيفة بدلاً من ذلك؟
void write4dhex(ostream& strm, int n)
{
strm << "0x" << hex << setw(4) << setfill('0') << n;
}