هل هناك طريقة جيدة للجمع بين المتلاعبين؟

StackOverflow https://stackoverflow.com/questions/3159396

  •  01-10-2019
  •  | 
  •  

سؤال

إذا كنت أرغب في إخراج رقم سداسي عرض ثابت مع 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top