সি ++ ২০ টি ধারণা: টেমপ্লেট যুক্তি একাধিক ধারণার জন্য যোগ্যতা অর্জন করলে কোন টেম্পলেট বিশেষায়নের পছন্দ হয়?


23

প্রদত্ত:

#include <concepts>
#include <iostream>

template<class T>
struct wrapper;

template<std::signed_integral T>
struct wrapper<T>
{
    wrapper() = default;
    void print()
    {
        std::cout << "signed_integral" << std::endl;
    }
};

template<std::integral T>
struct wrapper<T>
{
    wrapper() = default;
    void print()
    {
        std::cout << "integral" << std::endl;
    }
};

int main()
{
    wrapper<int> w;
    w.print(); // Output : signed_integral
    return 0;
}

উপরের কোড থেকে, intউভয় std::integralএবং std::signed_integralধারণার জন্য যোগ্যতা অর্জন করে ।

আশ্চর্যের বিষয় হল এটি জিসিসি এবং এমএসভিসি উভয় সংকলকগুলিতে "সাইন ইন_ইন্টেগ্রাল" সংকলন এবং মুদ্রণ করে। আমি প্রত্যাশা করছিলাম "টেমপ্লেট বিশেষায়িতকরণ ইতিমধ্যে সংজ্ঞায়িত হয়েছে" এর পংক্তিতে এটি একটি ত্রুটির সাথে ব্যর্থ হবে।

ঠিক আছে, এটি আইনী, যথেষ্ট ন্যায্য, তবে std::signed_integralপরিবর্তে কেন তাকে বেছে নেওয়া হয়েছিল std::integral? যখন একাধিক ধারণা টেমপ্লেট যুক্তির জন্য যোগ্য হয় তখন কোন টেম্পলেট বিশেষায়নের সাথে আদর্শের সাথে সংজ্ঞায়িত কোনও নিয়ম রয়েছে?


সংস্থাপক (গুলি) এটি মেনে নেওয়ার বিষয়টি দ্বারা আইনী বলে আমি বিশেষভাবে এটি বলব না, বিশেষত এটি গ্রহণের প্রাথমিক পর্যায়ে।
স্লাভা

@ স্লাভা এই ক্ষেত্রে এটি হ'ল, ধারণাগুলি যত্ন সহকারে ডিজাইন করা হয়েছে যাতে তারা একে অপরকে স্বজ্ঞাত উপায়ে উপস্থাপন করে
গিলিয়াম র্যাকিকোট

@ গুইলাউমরিচিকোট এটি ঠিক আছে, আমি কেবল মন্তব্য করেছি যে উপসংহারটি "এটি আইনী কারণ সংকলক এটি গ্রহণ করেছে" বলে বিভ্রান্তিকর বলে দেয়। যদিও এটি আইনী নয় আমি বলিনি।
স্লাভা

উত্তর:


14

এটি কারণ ধারণাগুলি অন্যদের চেয়ে বেশি বিশেষায়িত হতে পারে, কীভাবে টেমপ্লেট নিজেরাই অর্ডার করে। এটিকে সীমাবদ্ধতার আংশিক ক্রম বলা হয়

ধারণাগুলির ক্ষেত্রে, যখন তারা সমতুল্য সীমাবদ্ধতাগুলি অন্তর্ভুক্ত করে তখন তারা একে অপরকে গ্রাহ্য করে। উদাহরণস্বরূপ, কীভাবে std::integralএবং std::signed_integralপ্রয়োগ করা হয় তা এখানে :

template<typename T>
concept integral = std::is_integral_v<T>;

template<typename T> //   v--------------v---- Using the contraint defined above
concept signed_integral = std::integral<T> && std::is_signed_v<T>;

সীমাবদ্ধতাগুলিকে সাধারণীকরণ করা এইটিতে সংশ্লেষের প্রকাশটি কমিয়ে দেয়:

template<typename T>
concept integral = std::is_integral_v<T>;

template<typename T>
concept signed_integral = std::is_integral_v<T> && std::is_signed_v<T>;

এই উদাহরণে, সম্পূর্ণ signed_integralবোঝা integral। সুতরাং এক অর্থে, একটি স্বাক্ষরিত ইন্টিগ্রাল একটি ইন্টিগ্রালের চেয়ে "আরও সীমাবদ্ধ"।

স্ট্যান্ডার্ড এটি লিখেছে:

থেকে [temp.func.order] / 2 (জোর খনি):

আংশিক ক্রম দুটি ফাংশন টেম্প্লেটগুলির মধ্যে কোনটি অন্য টেমপ্লেটের পরিবর্তে প্রতিটি টেম্পলেটকে রূপান্তর করে (পরবর্তী অনুচ্ছেদ দেখুন) এবং ফাংশনের ধরণটি ব্যবহার করে টেমপ্লেট আর্গুমেন্ট কর্তন সম্পাদন করে তা নির্বাচন করে। কাটা প্রক্রিয়াটি নির্ধারণ করে যে কোনও একটি টেমপ্লেট অন্যর চেয়ে বেশি বিশেষায়িত। যদি তা হয় তবে আরও বিশেষায়িত টেম্পলেটটি আংশিক ক্রম প্রক্রিয়া দ্বারা বেছে নেওয়া chosen যদি উভয় কর্তন সফল হয়, আংশিক ক্রম [টেম্পকনস্ট্রার অর্ডার] এর বিধি দ্বারা বর্ণিত হিসাবে আরও সীমাবদ্ধ টেম্পলেট নির্বাচন করে ।

এর অর্থ হ'ল যদি কোনও টেমপ্লেটের একাধিক সম্ভাব্য প্রতিস্থাপন থাকে এবং উভয়ই আংশিক ক্রম থেকে বেছে নেওয়া হয় তবে এটি সর্বাধিক সীমাবদ্ধ টেম্পলেটটি নির্বাচন করবে।

থেকে [temp.constr.order] / 1 :

একটি বাধ্যতা পি subsumes একটি বাধ্যতা প্রশ্ন যদি এবং কেবল যদি, যে বিয়োজক অব্যয় দফা জন্য পি আমি এর বিয়োজক অব্যয় স্বাভাবিক আকারে পি , পি আমি প্রত্যেক সংযোজক দফা subsumes প্রশ্ন এর সংযোজক স্বাভাবিক আকারে প্রশ্ন , যেখানে

  • একটি বিয়োজক অব্যয় দফা পি আমি সংযোজক দফা subsumes প্রশ্ন যদি এবং কেবল যদি সেখানে একটি পারমাণবিক বাধ্যতা বিদ্যমান পি IA মধ্যে পি আমি যার জন্য সেখানে একটি পারমাণবিক বাধ্যতা বিদ্যমান প্রশ্নঃ JB মধ্যে প্রশ্ন যেমন যে পি IA subsumes প্রশ্ন JB , এবং

  • একটি পারমাণবিক সীমাবদ্ধতা A [ অন্যটি পারমাণবিক প্রতিবন্ধকতা বি বিভক্ত করে এবং যদি কেবলমাত্র A এবং B [temp.constr.atomic] এ বর্ণিত বিধিগুলি ব্যবহার করে অভিন্ন হয় ।

এটি সাবস্ক্রিপশন অ্যালগরিদম বর্ণনা করে যা সংকলকগুলি অর্ডার করতে সংকলক ব্যবহার করে এবং তাই ধারণাগুলি।


2
দেখে মনে হচ্ছে আপনি কোনও অনুচ্ছেদের মাঝখানে চলে
যাচ্ছেন

11

সি ++ ২০-এ সিদ্ধান্ত নেওয়ার জন্য একটি ব্যবস্থা আছে যখন কোনও নির্দিষ্ট সীমাবদ্ধ সত্তা যখন অন্যটির চেয়ে "বেশি বাধা" থাকে। এটি কোনও সাধারণ জিনিস নয়।

এটি তার পারমাণবিক উপাদানগুলির মধ্যে একটি প্রতিবন্ধকতা ভাঙার ধারণা দিয়ে শুরু হয়, একটি প্রক্রিয়া সীমাবদ্ধকরণকে সাধারণীকরণ বলে । এখানে toোকানো বড় এবং জটিল, তবে মূল ধারণাটি হ'ল প্রতিবন্ধকতার প্রতিটি অভিব্যক্তি তার পুনরায় পরমাণু ধারণাগত টুকরো টুকরো টুকরো টুকরো হয়ে যায়, যতক্ষণ না আপনি এমন কোনও উপ-এক্সপ্রেশনটি পৌঁছান যা ধারণা নয়।

সুতরাং দেওয়া হয়েছে, আসুন দেখুন integralএবং signed_integralধারণাটি সংজ্ঞায়িত করা হয় কিভাবে :

template<class T>
  concept integral = is_integral_v<T>;
template<class T>
  concept signed_­integral = integral<T> && is_signed_v<T>;

এর পচানি integralঠিক হয় is_integral_v। পচন signed_integralহ'ল is_integral_v && is_signed_v

এখন, আমরা সীমাবদ্ধ উপশমের ধারণাটিতে আসি । এটি একধরনের জটিল, তবে মূল ধারণাটি হ'ল একটি সীমাবদ্ধতা সি 1 কে একটি প্রতিবন্ধকতা সি 2 "সাবসুম" করতে বলা হয় যদি সি 1 এর পচনশীল প্রতিটি সি 2 এর প্রতিটি উপ-এক্সপ্রেশন থাকে। আমরা দেখি যে করতে integralঅন্তর্ভূত করা নেই signed_integral, কিন্তু signed_integral আছে অন্তর্ভূত করা integralযেহেতু এটা রয়েছে সবকিছু, integralনা।

এর পরে, আমরা সীমাবদ্ধ সংস্থাগুলি অর্ডার করতে এসেছি:

ঘোষণাপত্র ডি 1 কমপক্ষে ঘোষণার ডি 2 হিসাবে সীমাবদ্ধ থাকে যদি * ডি 1 এবং ডি 2 উভয়ই সীমাবদ্ধ ঘোষণা এবং ডি 1 এর সাথে সম্পর্কিত সীমাবদ্ধতা ডি 2 এর সাথে সংযুক্ত থাকে; বা * ডি 2 এর কোনও সম্পর্কিত বাধা নেই।

কারণ signed_integralsubsumes integral, <signed_integral> wrapperহিসাবে "সীমাবদ্ধ অন্তত যেমন" হয় <integral> wrapper। যাইহোক, বিপরীতটি সত্য নয়, সাবমোশনটি বিপরীত হওয়ার কারণে নয়।

সুতরাং, "আরও বাধা" সত্তার নিয়মের সাথে একমত:

একটি ঘোষণাপত্র D1 অন্য ঘোষণার ডি 2 এর চেয়ে বেশি সীমাবদ্ধ থাকে যখন ডি 1 কমপক্ষে ডি 2 হিসাবে সীমাবদ্ধ থাকে এবং ডি 2 কমপক্ষে ডি 1 এর মতো সীমাবদ্ধ থাকে না।

যেহেতু এটি <integral> wrapperকমপক্ষে ততটা সীমাবদ্ধ নয় <signed_integral> wrapper, তবে দ্বিতীয়টিকে পূর্বের তুলনায় বেশি সীমাবদ্ধ মনে করা হয়।

এবং সেইজন্য, যখন তাদের দু'জনেই আবেদন করতে পারত, তত বেশি সীমাবদ্ধ ঘোষণার জয় হয়।


সচেতন বাধ্যতা subsumption নিয়ম যে হতে স্টপ একটি অভিব্যক্তি সম্মুখীন হয় যখন যা নয় concept। সুতরাং আপনি যদি এটি করেন:

template<typename T>
constexpr bool my_is_integral_v = std::is_integral_v<T>;

template<typename T>
concept my_signed_integral = my_is_integral_v<T> && std::is_signed_v<T>;

এই ক্ষেত্রে, গ্রাহ্য my_signed_integral হবে নাstd::integral । যদিও এটির জন্য my_is_integral_vঅভিন্নভাবে সংজ্ঞায়িত করা হয়েছে std::is_integral_v, কারণ এটি কোনও ধারণা নয়, সি ++ এর গ্রাহক বিধিগুলি সেগুলি একই কিনা তা নির্ধারণ করতে এটির মাধ্যমে পিয়ার করতে পারে না।

সুতরাং গ্রাহকতার নিয়মগুলি আপনাকে পারমাণবিক ধারণাগুলির উপর ধারণা তৈরি করতে উত্সাহ দেয়।


3

সঙ্গে Partial_ordering_of_constraints

একটি প্রতিবন্ধক পি সীমাবদ্ধ কিউকে পরিবেশন করতে বলা হয় যদি এটি প্রমান করা যায় যে পি এবং কিউ তে পারমাণবিক সীমাবদ্ধতার পরিচয় পর্যন্ত Q কে বোঝায় pro

এবং

সাবস্ক্রিপশন সম্পর্ক সীমাবদ্ধতার আংশিক ক্রম সংজ্ঞায়িত করে, যা নির্ধারণ করতে ব্যবহৃত হয়:

  • ওভারলোড রেজোলিউশনে কোনও অ-টেম্পলেট ফাংশনের জন্য সেরা ব্যবহারযোগ্য প্রার্থী
  • একটি ওভারলোড সেটে কোনও অ-টেম্পলেট ফাংশনের ঠিকানা
  • একটি টেমপ্লেট টেমপ্লেট আর্গুমেন্টের জন্য সেরা মিল
  • শ্রেণীর টেম্পলেট বিশেষায়নের আংশিক ক্রম
  • ফাংশন টেম্পলেটগুলির আংশিক ক্রম

এবং ধারণা std::signed_integralসাবসিমেট std::integral<T>ধারণা:

template < class T >
concept signed_integral = std::integral<T> && std::is_signed_v<T>;

সুতরাং আপনার কোড ঠিক আছে, std::signed_integralআরও "বিশেষজ্ঞ" হিসাবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.