একই_এর কনসেপ্ট চেক করে সমতা দু'বার টাইপ করে কেন?


19

Https://en.cppreferences.com/w/cpp/concepts/same_as এ একই_এর ধারণার সম্ভাব্য বাস্তবায়নটি দেখে আমি লক্ষ্য করেছি যে অদ্ভুত কিছু ঘটছে।

namespace detail {
    template< class T, class U >
    concept SameHelper = std::is_same_v<T, U>;
}

template< class T, class U >
concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>;

প্রথম প্রশ্নটি হল কেন একটি SameHelperধারণাটি কেন জড়িত? দ্বিতীয়টি কেন same_asচেকগুলি Tএকই Uএবং Uএকই হিসাবে হয় T? এটি কি অপ্রয়োজনীয় নয়?


ঠিক কারণ SameHelper<T, U>সত্য SameHelper<U, T>হতে পারে এর অর্থ হতে পারে না।
কিছু প্রোগ্রামার

1
যে বিন্দু, একটি সমান বি, বি সমান যদি তাই না?
ব্যবহারকারী 7769147

@ ব্যবহারকারী 7769147 হ্যাঁ, এবং এটি সেই সম্পর্কটিকে সংজ্ঞায়িত করছে।
ফ্রান্সোইস অ্যান্ডরিয়াক

4
হুম স্ট্যান্ডার্ড :: ইস্যু: এর ডকুমেন্টেশন এমনকি বলেছে " কম্যুটিভিটি সন্তুষ্ট, অর্থাত্ দুটি এবং টি এবং ইউ এর জন্য, is_same<T, U>::value == trueযদি এবং কেবল তবেই is_same<U, T>::value == true।" এর থেকে বোঝা যায় যে এই ডাবল চেকটি প্রয়োজনীয় নয়
কেভিন

1
না, এটি ভুল, std :: is_same বলেছেন: যদি এবং শুধুমাত্র শর্তটি ধরে রাখে তবে দুটি ধরণের পরিবর্তনশীল। এটি অগত্যা হয় না। তবে আমি দুটি বহন-পরিবহনের ধরণের উদাহরণ খুঁজে পেতে ব্যর্থ হয়েছি।
নেমানজা বোরিক

উত্তর:


16

আকর্ষণীয় প্রশ্ন। আমি সম্প্রতি ধারণাগুলির বিষয়ে অ্যান্ড্রু সুতনের আলাপ দেখেছি, এবং প্রশ্নোত্তর পর্বে কেউ নিম্নলিখিত প্রশ্নটি জিজ্ঞাসা করেছেন (নিম্নলিখিত লিঙ্কে টাইমস্ট্যাম্প): সিপিপিসন 2018: অ্যান্ড্রু সাটন "60 এর মধ্যে ধারণাগুলি: আপনার যা কিছু জানা দরকার এবং যা কিছুই আপনি করেন না"

সুতরাং প্রশ্নটি ফুটে উঠেছে: If I have a concept that says A && B && C, another says C && B && A, would those be equivalent?অ্যান্ড্রু হ্যাঁ উত্তর দিয়েছিল, তবে সত্যটি নির্দেশ করে যে কম্পাইলারটির কিছু অভ্যন্তরীণ পদ্ধতি রয়েছে (এটি ব্যবহারকারীর কাছে স্বচ্ছ) ধারণাটিকে অণু লজিকাল প্রস্তাবগুলিতে বিভক্ত করার জন্য ( atomic constraintsঅ্যান্ড্রু শব্দের সাথে শব্দটি শব্দের সাথে সংশ্লেষ করেছিলেন) এবং সেগুলি পরীক্ষা করে কিনা সমতুল্য.

এখন দেখুন cppreferences সম্পর্কে কি বলে std::same_as:

std::same_as<T, U>উপসাগর std::same_as<U, T>এবং বিপরীত।

এটি মূলত "যদি-এবং-কেবলমাত্র" সম্পর্ক হয়: তারা একে অপরকে বোঝায়। (যৌক্তিক সাম্য)

আমার অনুমান যে এখানে পারমাণবিক সীমাবদ্ধতা রয়েছে std::is_same_v<T, U>। সংকলকগণ যেভাবে আচরণ করে std::is_same_vতা তাদের ভাবতে std::is_same_v<T, U>এবং std::is_same_v<U, T>দুটি পৃথক বাধা হিসাবে (তারা আলাদা আলাদা সত্তা!) তৈরি করতে পারে। সুতরাং আপনি যদি std::same_asতাদের মধ্যে একটি ব্যবহার করে বাস্তবায়ন করেন:

template< class T, class U >
concept same_as = detail::SameHelper<T, U>;

তারপরে std::same_as<T, U>এবং std::same_as<U, T>বিভিন্ন পরমাণু সীমাবদ্ধতায় "বিস্ফোরিত" হবে এবং সমতুল্য হবে না।

আচ্ছা, সংকলক কেন যত্ন করে?

এই উদাহরণ বিবেচনা করুন :

#include <type_traits>
#include <iostream>
#include <concepts>

template< class T, class U >
concept SameHelper = std::is_same_v<T, U>;

template< class T, class U >
concept my_same_as = SameHelper<T, U>;

// template< class T, class U >
// concept my_same_as = SameHelper<T, U> && SameHelper<U, T>;

template< class T, class U> requires my_same_as<U, T>
void foo(T a, U b) {
    std::cout << "Not integral" << std::endl;
}

template< class T, class U> requires (my_same_as<T, U> && std::integral<T>)
void foo(T a, U b) {
    std::cout << "Integral" << std::endl;
}

int main() {
    foo(1, 2);
    return 0;
}

আদর্শভাবে, my_same_as<T, U> && std::integral<T>সাবুম my_same_as<U, T>; অতএব, সংকলকটির দ্বিতীয় টেম্পলেট বিশেষীকরণ নির্বাচন করা উচিত, ব্যতীত ... এটি করে না: সংকলকটি একটি ত্রুটি নির্গত করে error: call of overloaded 'foo(int, int)' is ambiguous

এর পিছনে কারণ হ'ল যেহেতু my_same_as<U, T>এবং my_same_as<T, U>একে অপরকে গ্রাহ্য করে না my_same_as<T, U> && std::integral<T>এবং my_same_as<U, T>অতুলনীয় হয়ে যায় ( উপস্থার সম্পর্কের অধীনে আংশিকভাবে অর্ডার করা সীমাবদ্ধতার উপর)।

তবে, যদি আপনি প্রতিস্থাপন

template< class T, class U >
concept my_same_as = SameHelper<T, U>;

সঙ্গে

template< class T, class U >
concept my_same_as = SameHelper<T, U> && SameHelper<U, T>;

কোডটি সংকলন করে।


একই_এই <টি, ইউ> এবং একই_এ <ইউ, টি> বিভিন্ন পারমাণবিক প্রতিবন্ধক হতে পারে তবে তাদের ফলাফল এখনও একই be যৌগিক দৃষ্টিকোণ থেকে যৌক্তিক দৃষ্টিকোণ থেকে একইরকম দুটি পৃথক পারমাণবিক সীমাবদ্ধতা হিসাবে একই সংজ্ঞা নির্ধারণ সম্পর্কে কেন কম্পাইলার এত যত্ন করে?
ব্যবহারকারী 7769147

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

@ ব্যবহারকারী 7769147 আপডেট হওয়া উত্তর দেখুন।
রিন Kaenbyou

1
মনে হয় প্রচলিত জ্ঞান ধারণা ধারণা সমতা সম্পর্কে ভুল। টেমপ্লেটগুলি থেকে is_same<T, U>পৃথক যেখানে একই is_same<U, T>, দুটি পরমাণু সীমাবদ্ধতাকে অভিন্ন হিসাবে বিবেচনা করা হবে না যদি না তারা একই অভিব্যক্তি থেকে গঠিত হয়। সুতরাং উভয়ের প্রয়োজন।
অ্যান্ডি

কি হবে are_same_as? template<typename T, typename U0, typename... Un> concept are_same_as = SameAs<T, U0> && (SameAs<T, Un> && ...);কিছু ক্ষেত্রে ব্যর্থ হবে। উদাহরণস্বরূপ, are_same_as<T, U, int>সমান হবে are_same_as<T, int, U>তবে নয়are_same_as<U, T, int>
ব্যবহারকারীর 7769147

2

std::is_same সত্য হিসাবে সংজ্ঞায়িত করা হয় এবং কেবল যদি:

টি এবং ইউ একই সিভি-যোগ্যতার সাথে একই ধরণের নাম দেয়

আমি যতদূর জানি, স্ট্যান্ডার্ডটি "একই ধরণের" এর অর্থ সংজ্ঞায়িত করে না, তবে প্রাকৃতিক ভাষা এবং যুক্তিতে "একই" একটি সমতুল্য সম্পর্ক এবং এইভাবে পরিবর্তিত হয়।

এই ধারণাটি দেওয়া, যা আমি স্বীকার করি, is_same_v<T, U> && is_same_v<U, V>তা সত্যই বাড়াবাড়ি হবে। তবে same_­asশর্তে নির্দিষ্ট করা হয়নি is_same_v; এটি কেবল প্রকাশের জন্য।

উভয়ের সুস্পষ্ট চেকটি রূপান্তরকামী না হয়েই same-as-implসন্তুষ্টির জন্য বাস্তবায়নের অনুমতি দেয় same_­as। এটি এটিকে নির্দিষ্ট করে কীভাবে ধারণাটি বাস্তবায়িত হতে পারে তা সীমাবদ্ধ না করে ঠিক কীভাবে আচরণ করে তা বর্ণনা করে।

সঠিকভাবে কেন এই পদ্ধতির শর্তাবলী নির্দিষ্ট করার পরিবর্তে বেছে নেওয়া হয়েছিল is_same_v, আমি জানি না। নির্বাচিত পদ্ধতির একটি সুবিধা যুক্তিযুক্ত যে দুটি সংজ্ঞা ডি-কাপলড। একটি অন্যের উপর নির্ভর করে না।


2
আমি আপনার সাথে একমত, কিন্তু এই শেষ যুক্তি কিছুটা প্রসারিত। আমার কাছে এটির মতো শোনাচ্ছে: "আরে, আমার এই পুনঃব্যবহারযোগ্য উপাদানটি রয়েছে যা আমাকে বলে যে দুটি প্রকার একই রকম কিনা Now এখন আমার কাছে এই অন্যান্য উপাদান রয়েছে যা টাইপগুলি একই কিনা তা জানা দরকার, তবে আমার পূর্ববর্তী উপাদানটি পুনরায় ব্যবহার করার পরিবর্তে , আমি এই মামলার সুনির্দিষ্টভাবে একটি অ্যাডহক সমাধান তৈরি করব equality এখন যে ছেলেটির সাম্যতার সংজ্ঞা রয়েছে তার কাছ থেকে সমতার সংজ্ঞা প্রয়োজন এমন লোকটিকে আমি 'ডুপ্লুপ' করেছি Y হ্যাঁ! "
ক্যাসিও রেনান

1
@ CássioRenan শিওর আমি যেমন বলেছিলাম, কেন জানি না, এটিই কেবল সর্বোত্তম যুক্তি যা আমি সামনে আসতে পারি। লেখকদের আরও ভাল যুক্তি থাকতে পারে।
এরেরিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.