كتابة سمات أنواع مخصّصة
أنشئ سمات الأنواع الخاصة بك
كتابة سمات أنواع مخصّصة درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
بناء السمات الخاصة بكم
عندما لا توفر المكتبة القياسية السؤال الذي تحتاجون إليه، يمكنكم كتابة سمة مخصصة. والسمة ببساطة قالب يعرّض ::value أو ::type.
القالب الأساسي + التخصيص
النمط القياسي هو قالب أساسي تكون قيمته الافتراضية false، مع تخصيص يطابق نوعًا معينًا ويضبط القيمة على true.
#include <iostream>
#include <type_traits>
template <typename T>
struct is_ptr : std::false_type {};
template <typename T>
struct is_ptr<T*> : std::true_type {};
int main() {
std::cout << is_ptr<int>::value << "\n";
std::cout << is_ptr<int*>::value << "\n";
return 0;
}الوراثة من integral_constant
عند الوراثة من std::true_type أو std::false_type، تحصل سمتكم تلقائيًا على عضو value وتتصرف مثل السمات القياسية.
كاشف الحاويات
اكتشفوا ما إذا كان النوع يشبه حاوية، وذلك بالتحقق من وجود أعضاء متداخلة. نخصص القالب هنا عند وجود typedef باسم value_type، باستخدام أداة مساعدة.
#include <iostream>
#include <vector>
#include <type_traits>
template <typename T, typename = void>
struct has_value_type : std::false_type {};
template <typename T>
struct has_value_type<T, std::void_t<typename T::value_type>> : std::true_type {};
int main() {
std::cout << has_value_type<std::vector<int>>::value << "\n";
std::cout << has_value_type<int>::value << "\n";
return 0;
}شرح std::void_t
تحوّل std::void_t<...> أي قائمة أنواع صالحة إلى void. وإذا كان أي نوع داخلها غير صالح، يُسقط التخصيص باستخدام SFINAE، ولذلك يفوز false_type الأساسي.
اكتشاف دالة عضو
يمكنكم اكتشاف ما إذا كان النوع يحتوي على size() قابلة للاستدعاء، وذلك باختبار التعبير داخل void_t.
#include <iostream>
#include <string>
#include <type_traits>
template <typename T, typename = void>
struct has_size : std::false_type {};
template <typename T>
struct has_size<T, std::void_t<decltype(std::declval<T>().size())>> : std::true_type {};
int main() {
std::cout << has_size<std::string>::value << "\n";
std::cout << has_size<int>::value << "\n";
return 0;
}declval
ينتج std::declval<T>() قيمة وهمية من النوع T في السياقات التي لا تُقيَّم، مما يتيح لكم كتابة تعبيرات decltype دون إنشاء كائن.
سمة تحويل
يمكن للسمات المخصصة أيضًا إنتاج أنواع. وهذه السمة تزيل طبقة واحدة من المؤشر.
#include <iostream>
#include <type_traits>
template <typename T>
struct remove_one_pointer { using type = T; };
template <typename T>
struct remove_one_pointer<T*> { using type = T; };
int main() {
using R = remove_one_pointer<int*>::type;
std::cout << std::is_same_v<R, int> << "\n";
return 0;
}توفير الأداتين _v و _t
حاكوا أسلوب المكتبة القياسية بإضافة قوالب للمتغيرات وقوالب مستعارة.
#include <iostream>
#include <type_traits>
template <typename T>
struct is_char : std::false_type {};
template <>
struct is_char<char> : std::true_type {};
template <typename T>
inline constexpr bool is_char_v = is_char<T>::value;
int main() {
std::cout << is_char_v<char> << "\n";
std::cout << is_char_v<int> << "\n";
return 0;
}نمط الاكتشاف
تتعمم تقنية void_t إلى نمط الاكتشاف، الذي يضفي عليه std::is_detected التجريبي صيغة رسمية. وتجعل مفاهيم C++20 جزءًا كبيرًا من ذلك أكثر وضوحًا.
اختبار السمات الخاصة بكم
تحققوا من السمات المخصصة باستخدام static_assert، حتى يتسبب أي تراجع في فشل عملية البناء فورًا.
#include <type_traits>
template <typename T>
struct is_void_like : std::false_type {};
template <>
struct is_void_like<void> : std::true_type {};
static_assert(is_void_like<void>::value);
static_assert(!is_void_like<int>::value);
int main() { return 0; }اختبار سريع
تذكّروا دور std::void_t.
مراجعة
لقد تعلمتم كتابة سمات مخصصة.
- يكون القالب الأساسي
falseافتراضيًا، بينما يضبط التخصيص القيمة علىtrue - الوراثة من
true_type/false_type - تشكّل
void_tمعdeclvalأساس نمط الاكتشاف - أضيفوا الأداتين
_v/_tواختبروا باستخدامstatic_assert
الأسئلة الشائعة
هل درس «كتابة سمات أنواع مخصّصة» مجاني؟
نعم — نص درس «كتابة سمات أنواع مخصّصة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «كتابة سمات أنواع مخصّصة»؟
أنشئ سمات الأنواع الخاصة بك تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «كتابة سمات أنواع مخصّصة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الاستعلام عن الأنواع
- تحويل الأنواع
- المنطق الشرطي
- كتابة سمات أنواع مخصّصة