Avatar ·

في C++ عند تعريف القوالب: class أم typename — ما الفرق وأيهما أفضل للاستخدام؟

مرحبًا بالجميع! بدأت تعلم القوالب في C++ ولاحظت أنه في بعض الأمثلة يُستخدم الكلمة المفتاحية `class` بينما في أخرى يُستخدم `typename`. على سبيل المثال، هذان التعريفان، حسب فهمي، يفعلان نفس الشيء: ```cpp template void foo(T value) { } template void foo(T value) { } ``` أنا مرتبك. يبدو أن كلا الخيارين يعملان، لكن أيهما صحيح؟ هل هناك أي فرق بينهما غير الصياغة؟ قرأت أن `typename` ظهر لاحقًا، وأن بعض المبرمجين القدامى يفضلون `class` بدافع العادة. لكن يبدو لي غريبًا استخدام كلمة `class` لمعامل قد لا يكون كلاسًا، بل مثلًا `int` أو `double`. في نفس الوقت، `typename` يبدو أكثر شمولية. بالإضافة إلى ذلك، سمعت أن هناك حالات يمكن فيها استخدام `typename` فقط، بينما `class` لا يصلح. هل هذا صحيح؟ إذا كان الأمر كذلك، فأعط أمثلة. وبشكل عام، ما هو الأسلوب الجيد في C++ الحديثة (C++11, C++14, C++17, C++20)؟ أي خيار يُوصى به؟