مقدمة عن مكتبة fmt في لغة C++
مكتبة fmt (أو fmtlib) هي مكتبة حديثة وسريعة وآمنة لتنسيق النصوص في لغة C++. توفر بديلاً متطوراً للدوال القديمة مثل printf و sprintf، وكذلك للتيارات المعقدة std::stringstream. الهدف الأساسي من fmt هو جعل تنسيق النصوص بسيطاً وآمناً من حيث الأنواع وقابلاً للتوسع وعالي الأداء.
لماذا تحتاج إلى fmt؟ أولاً، تحل مشكلة أمان الأنواع. فدالة printf لا تتحقق من أنواع الوسائط، مما يؤدي إلى سلوك غير محدد وأخطاء يصعب اكتشافها. أما fmt فتستخدم قوالب C++ وتتحقق من الأنواع أثناء مرحلة التجميع. ثانياً، fmt أسرع بكثير من std::stringstream، وغالباً ما تكون أسرع من printf. ثالثاً، بناء جملتها بديهي ويشبه تنسيق النصوص في Python، مما يسهل الانتقال بين اللغات. لدرجة أن fmt أصبحت الأساس لـ std::format الذي تم اعتماده في معيار C++20.
في موقع pythonlib.ru، نتحدث غالباً عن Python، لكن fmt هي مثال رائع على كيفية انتقال الأفكار الجيدة من Python إلى عالم C++ لتصبح المعيار الفعلي. إذا كنت تكتب بلغة C++ وتريد أن تفعل ذلك بأسلوب حديث، فإن fmt هي مكتبة لا غنى عنها في أدواتك.
تثبيت مكتبة fmt
التثبيت عبر مديري الحزم (Conan, vcpkg)
أسهل طريقة لتثبيت fmt في مشروع C++ حديث هي استخدام مدير الحزم.
Conan:
conan install fmt/10.1.1@
# أو في ملف conanfile.txt الخاص بك:
# [requires]
# fmt/10.1.1
vcpkg:
vcpkg install fmt
# ثم في ملف CMakeLists.txt:
# find_package(fmt CONFIG REQUIRED)
# target_link_libraries(your_project PRIVATE fmt::fmt)
التثبيت يدوياً (بناء من المصدر)
يمكنك تنزيل الكود المصدري من GitHub وبنائه باستخدام CMake:
git clone https://github.com/fmtlib/fmt.git
cd fmt
mkdir build && cd build
cmake ..
make -j4
sudo make install
التثبيت عبر pip (لاستخدامه في إضافات Python)
على الرغم من أن fmt هي مكتبة C++، يمكن تثبيتها كحزمة Python إذا كنت تكتب إضافة بلغة C++ باستخدام pybind11 أو cppyy:
pip install fmt
ومع ذلك، في سياق C++ الخالص، هذا ليس له معنى. عادةً ما تقوم فقط بتضمين ملفات الرأس.
ربط المكتبة بالمشروع (وضع header-only)
يمكن استخدام fmt في وضع header-only بمجرد نسخ مجلد include/fmt إلى مشروعك وإضافة:
#define FMT_HEADER_ONLY
#include "fmt/core.h"
#include "fmt/format.h"
بداية سريعة مع مثال كود
لنبدأ بأبسط مثال يوضح التنسيق الأساسي:
#include <fmt/core.h>
#include <fmt/format.h>
#include <iostream>
int main() {
// أبسط تنسيق
std::string message = fmt::format("مرحباً، {}! عمرك {} سنة.", "العالم", 42);
std::cout << message << std::endl;
// الطباعة إلى stdout
fmt::print("قيمة Pi تقريباً {:.2f}\n", 3.14159);
// التنسيق باستخدام وسائط مسماة (نمط C++20)
fmt::print("المستخدم: {name}, العمر: {age}\n",
fmt::arg("name", "أحمد"),
fmt::arg("age", 30));
return 0;
}
هذا الكود سيطبع:
مرحباً، العالم! عمرك 42 سنة.
قيمة Pi تقريباً 3.14
المستخدم: أحمد, العمر: 30
كما ترى، بناء الجملة {} مشابه جداً لـ Python. كل شيء بديهي وسهل القراءة.
الدوال الأساسية في مكتبة fmt
فيما يلي شرح تفصيلي للدوال الرئيسية في fmt. سنستعرض توقيعاتها ومعاملاتها وأمثلة على استخدامها.
1. fmt::format
الوصف: