c++ - ج++ 20: مفاهيم أنواع متعددة والقيد ، بناء الجملة الصحيح؟




templates c++20 (3)

بناء جملة آخر يتجنب إدخال معلمات القوالب على الإطلاق (على حساب إضافة تكرار آخر):

bool are_equal(auto x,auto y)
  requires AreEqComparable<decltype(x),decltype(y)>
  {return x==y;}

يبدو أنه في معيار c++20 ، وفقًا لتقرير reddit هذا ، سوف نكون قادرين على تحديد concept القالب ولكل قالب فئة / وظيفة ، سنكون قادرين على ضبط constraints على أنواعها. ومع ذلك ، في الوثائق والبرامج التعليمية (على سبيل المثال constraints ) ، لم أتمكن من العثور على بناء الجملة الصحيح لحالة الاستخدام متعددة الأنواع.

لنفترض أن لدينا مفهوم متعدد الأنواع:

template<typename T1, typename T2>
concept AreEqComparable = requires(T1 a, T2 b) {
    { a == b } -> bool;
};

دعنا نقول ، أريد تحديد وظيفة مقارنة بسيطة بين نوعين مختلفين. كيف أقوم بذلك؟ بشكل أكثر تحديدا ، ماذا يجب أن أكتب في ??? جزء من الكود أدناه:

???
bool are_equal(T1 a, T2 b) { return a == b; }

لم أجد أي إشارة إلى هذه الحالة constraints ، here ، وحتى concept . لقد جربت بشكل عشوائي شيء مثل:

/* 1 */ template<AreEqComparable T1, T2>
/* 2 */ AreEqComparable<T1, T2>
/* 3 */ template<AreEqComparable<T1, T2>>

ولكن كل منهم يلقي أخطاء بناء الجملة. أعتقد أن الإجابة يجب أن تكمن في مكان ما في مواصفات P0557 بواسطة Bjarne Stroustrup ، لكن الوقت طويل جدًا بالنسبة لي كي أقرأه.


في GCC 8.2.0 ، يجب كتابة المفاهيم مثل:

concept bool ConceptName = /* ... */

لكن قوالب C ++: الدليل الكامل لا تذكر bool . نظرًا لعدم إصدار معيار C ++ 20 ، فمن الصعب تحديد ما هو الصحيح.

بالنسبة للمفاهيم التي تحتاج إلى معلمة واحدة (وليس بالضرورة كتابة) ، هناك اختصار:

template <UnaryConceptName T>

بالنسبة لأولئك الذين يحتاجون إلى معلمتين أو أكثر ، لا يوجد اختصار:

template <typename T1, typename T2> requires BinaryConceptName<T1, T2>

يمكن استبدال typename باسم نوع محدد.

على فكرة:

  1. يقدم الكتاب الذي ذكرته أعلاه مقدمة موجزة للمفاهيم.

  2. استخدام -fconcepts في دول مجلس التعاون الخليجي لتمكين المفاهيم.


يمكنك كتابتها مثل هذا:

template <typename T1, typename T2>
    requires AreEqComparable<T1, T2>
bool are_equal(T1 a, T2 b)
{
    // ...
}

هنا ، نستخدم جملة شرط لفرض شرط على معلمات قالب الكتابة.





c++-concepts