সি এবং সি ++ তে ইউনিয়নগুলির উদ্দেশ্য


254

আমি আগে ইউনিয়নগুলি স্বাচ্ছন্দ্যে ব্যবহার করেছি; আজ আমি এই পোস্টটি পড়ার সময় শঙ্কিত হয়েছি এবং এই কোডটি জানতে পেরেছিলাম

union ARGB
{
    uint32_t colour;

    struct componentsTag
    {
        uint8_t b;
        uint8_t g;
        uint8_t r;
        uint8_t a;
    } components;

} pixel;

pixel.colour = 0xff040201;  // ARGB::colour is the active member from now on

// somewhere down the line, without any edit to pixel

if(pixel.components.a)      // accessing the non-active member ARGB::components

প্রকৃতপক্ষে অপরিবর্তিত আচরণ e অর্থ ইউনিয়নের কোনও সদস্যের কাছ থেকে পড়া যা সম্প্রতি লেখা হয়েছে তা অপরিজ্ঞাত আচরণের দিকে নিয়ে যায়। এটি যদি ইউনিয়নগুলির উদ্দেশ্যে ব্যবহার না হয় তবে কী? কেউ দয়া করে এটিকে বিস্তৃতভাবে ব্যাখ্যা করতে পারেন?

হালনাগাদ:

আমি অনড় দৃষ্টিতে কয়েকটি বিষয় পরিষ্কার করতে চেয়েছিলাম।

  • প্রশ্নের উত্তর সি এবং সি ++ এর জন্য এক নয়; আমার অজ্ঞ অল্প বয়স্ক স্ব এটিকে সি এবং সি ++ উভয় হিসাবে ট্যাগ করেছেন।
  • সি ++ ১১-এর মানদণ্ডের মাধ্যমে ঝাঁকুনির পরে আমি শেষ পর্যন্ত বলতে পারি না যে এটি অ-সক্রিয় ইউনিয়ন সদস্যের অ্যাক্সেস / পরিদর্শনকে অনির্ধারিত / অনির্ধারিত / বাস্তবায়ন-সংজ্ঞায়িত। আমি যা খুশি তা হ'ল § 9.5 / 1:

    যদি একটি স্ট্যান্ডার্ড-লেআউট ইউনিয়নে বেশ কয়েকটি স্ট্যান্ডার্ড-লেআউট স্ট্রাক্ট থাকে যা একটি সাধারণ প্রাথমিক ক্রম ভাগ করে দেয় এবং যদি এই স্ট্যান্ডার্ড-লেআউট ইউনিয়ন ধরণের কোনও স্ট্যান্ডার্ড-লেআউট স্ট্রাক্ট থাকে তবে এটির যে কোনও সাধারণ প্রাথমিক ক্রমটি পরীক্ষা করার অনুমতি দেওয়া হয় স্ট্যান্ডার্ড-লেআউট স্ট্রাক্ট সদস্যদের। §৯.২ / ১৯: দুটি স্ট্যান্ডার্ড-লেআউট স্ট্রাক্ট একটি সাধারণ প্রাথমিক ক্রম ভাগ করে যদি সংশ্লিষ্ট সদস্যদের লেআউট-সামঞ্জস্যপূর্ণ প্রকার থাকে এবং উভয় সদস্যই বিট-ফিল্ড হয় না বা উভয়ই এক বা একাধিক প্রাথমিকের ক্রমের জন্য একই প্রস্থের বিট-ক্ষেত্র হয় সদস্যরা।

  • সিতে থাকাকালীন (সি 99 টিসি 3 - ডিআর 283 এর পরে) এটি করা বৈধ ( এই বিষয়টি সামনে আনার জন্য পাসকেল কুয়াককে ধন্যবাদ )। যাইহোক, এটির চেষ্টা করা এখনও অপরিজ্ঞাত আচরণের দিকে পরিচালিত করতে পারে , যদি মানটি পাঠ করা হয় তবে এটি যে ধরণের মাধ্যমে পড়া হয় তার জন্য অবৈধ (তথাকথিত "ট্র্যাপ প্রতিনিধিত্ব") বলে মনে হয়। অন্যথায়, মান পঠন বাস্তবায়ন সংজ্ঞায়িত করা হয়।
  • সি 98/90 এটিকে অনির্ধারিত আচরণের আওতায় আনা হয়েছে (আনেক্স জে) এবং কে অ্যান্ড আর এর বই বলছে এটির বাস্তবায়ন সংজ্ঞায়িত হয়েছে। কে অ্যান্ড আর এর উদ্ধৃতি:

    এটি ইউনিয়নের উদ্দেশ্য - একক ভেরিয়েবল যা বৈধভাবে বিভিন্ন ধরণের যে কোনও একটিকে ধরে রাখতে পারে। [...] যতক্ষণ ব্যবহার সামঞ্জস্যপূর্ণ: পুনরুদ্ধার করা টাইপটি সম্প্রতি সঞ্চিত ধরণ হতে হবে। বর্তমানে কোন ইউনিয়নে কোন ধরণের সঞ্চিত রয়েছে তা ট্র্যাক করা প্রোগ্রামারের দায়িত্ব; ফলগুলি বাস্তবায়ন-নির্ভর হয় যদি কোনও কিছু এক ধরণের হিসাবে সঞ্চিত থাকে এবং অন্য হিসাবে উত্তোলিত হয়।

  • স্ট্রস্ট্রপের টিসি ++ পিএল থেকে জোর দেওয়া (জোর দেওয়া খনি)

    "জাতীয় রূপান্তর " টাইপের জন্য কখনও কখনও অপব্যবহার করা ডেটাগুলির সংযোগের জন্য ইউনিয়নগুলির ব্যবহার অপরিহার্য হতে পারে ।

সর্বোপরি, এই প্রশ্নটি (যাঁর শিরোনামটি আমার জিজ্ঞাসা হওয়ার পরেও অপরিবর্তিত রয়েছে) ইউনিয়নগুলির উদ্দেশ্য বোঝার উদ্দেশ্য নিয়ে উত্থাপিত হয়েছিল এবং আদর্শটি কীভাবে পুনরায় ব্যবহারের জন্য উত্তরাধিকার ব্যবহারের বিষয়টি সি ++ স্ট্যান্ডার্ড দ্বারা অনুমোদিত তা নয়, তবে এটি উত্তরাধিকারকে C ++ ভাষা বৈশিষ্ট্য হিসাবে পরিচয় করানোর উদ্দেশ্য বা আসল উদ্দেশ্য ছিল না । এ কারণেই অ্যান্ডির উত্তর গ্রহণযোগ্য হিসাবে এখনও অবিরত রয়েছে।


11
সহজভাবে বলা হয়েছে, সংকলকগুলিকে কোনও কাঠামোর উপাদানগুলির মধ্যে প্যাডিং inোকানোর অনুমতি দেওয়া হয়। সুতরাং, b, g, r,এবং aএটি সামঞ্জস্যপূর্ণ নাও হতে পারে এবং এইভাবে একটি এর বিন্যাসের সাথে মেলে না uint32_t। এটি অন্যের দিকে ইঙ্গিত করেছে এমন শেষের দিকের বিষয়গুলি ছাড়াও।
টমাস ম্যাথিউজ

8
ঠিক এই কারণেই আপনাকে সি এবং সি ++ প্রশ্নগুলি ট্যাগ করা উচিত নয়। উত্তরগুলি পৃথক, তবে যেহেতু উত্তরদাতারা এমনকি তারা কোন ট্যাগটির জবাব দিচ্ছে তাও জানায় না (তারা কি জানেন?), আপনি আবর্জনা পান।
পাস্কেল কুয়াক

5
@ ডাউনভোটার ব্যাখ্যা না দেওয়ার জন্য ধন্যবাদ, আমি বুঝতে পেরেছি যে আপনি চাইছেন যে আমি আপনাকে জাদুকরভাবে আপনার গ্রিপ বুঝতে পারি এবং ভবিষ্যতে এর পুনরাবৃত্তি না করে: পি
কিংবদন্তি

1
ইউনিয়ন থাকার মূল উদ্দেশ্য সম্পর্কে , মনে রাখবেন যে সি স্ট্যান্ডার্ড পোস্ট ইউনিয়নগুলি বহু বছরের মধ্যে সি ইউনিয়নগুলি। ইউনিক্স ভি at-এর একটি তাত্ক্ষণিক দৃষ্টিভঙ্গি ইউনিয়নের মাধ্যমে কয়েকটি ধরণের রূপান্তর দেখায়।
নিনজালজ

3
scouring C++11's standard I couldn't conclusively say that it calls out accessing/inspecting a non-active union member is undefined [...] All I could find was §9.5/1... তাই? অনুচ্ছেদের শুরুতে আপনি একটি ব্যতিক্রম নোটটি উদ্ধৃত করেছেন, মূল পয়েন্টটি নয় : "একটি ইউনিয়নে, অ স্থিতিশীল ডেটা সদস্যদের মধ্যে সর্বাধিক একজন যে কোনও সময় সক্রিয় হতে পারে, এটি হ'ল বেশিরভাগের মধ্যে একটির মান অ স্থির ডেটা সদস্যদের যে কোনও সময় ইউনিয়নে সংরক্ষণ করা যায়। " - এবং নীচে পি 4: "সাধারণভাবে, একটি ইউনিয়নের সক্রিয় সদস্য পরিবর্তন করতে একজনকে অবশ্যই স্পষ্টকামী ডেস্ট্রাক্টর কল এবং নতুন অপারেটর ব্যবহার করতে হবে "
আন্ডারস্কোর_

উত্তর:


407

ইউনিয়নগুলির উদ্দেশ্য বরং সুস্পষ্ট, তবে কোনও কারণে লোকেরা এটি প্রায়শই মিস করে।

ইউনিয়নের উদ্দেশ্য একই মেমরি অঞ্চলটি বিভিন্ন সময়ে বিভিন্ন জিনিস সংরক্ষণের জন্য ব্যবহার করে স্মৃতি সংরক্ষণ করা memory এটাই.

এটি যেন হোটেলের কোনও কক্ষের মতো। বিভিন্ন লোক অবিচ্ছিন্ন সময়কালের জন্য এতে বাস করে। এই লোকেরা কখনও দেখা হয় না এবং সাধারণত একে অপরের সম্পর্কে কিছুই জানে না। কক্ষগুলির সময় ভাগ করে নেওয়ার ব্যবস্থাটি সঠিকভাবে পরিচালনার মাধ্যমে (অর্থাত্ বিভিন্ন ব্যক্তি একই সাথে একটি ঘরে নিযুক্ত না হয়ে থাকে তা নিশ্চিত করে), তুলনামূলকভাবে একটি ছোট হোটেল তুলনামূলকভাবে বড় সংখ্যক লোকের থাকার ব্যবস্থা করতে পারে, যা হোটেলগুলি জন্য.

ইউনিয়ন যা ঠিক তাই করে। যদি আপনি জানেন যে আপনার প্রোগ্রামের বেশ কয়েকটি অবজেক্টগুলি নন-ওভারল্যাপিং মান-জীবনকাল সহ মানগুলি ধরে রাখে, তবে আপনি এই বিষয়গুলিকে একটি ইউনিয়নে "মার্জ" করতে পারেন এবং এইভাবে স্মৃতি সংরক্ষণ করতে পারেন। হোটেলের ঘরে যেমন প্রতিটি মুহুর্তে সর্বাধিক একজন "সক্রিয়" ভাড়াটিয়া থাকে তেমনি প্রোগ্রামের প্রতিটি মুহুর্তে একটি ইউনিয়নের সর্বাধিক একজন "সক্রিয়" সদস্য থাকে। কেবলমাত্র "সক্রিয়" সদস্য পড়তে পারবেন। অন্য সদস্যকে লিখে আপনি সেই সক্রিয় সদস্যটিকে "সক্রিয়" স্থিতিতে স্যুইচ করেন।

কোনও কারণে ইউনিয়নের এই আসল উদ্দেশ্যটি সম্পূর্ণ ভিন্ন কিছু দিয়ে "ওভাররাইড" হয়ে উঠল: একটি ইউনিয়নের একজন সদস্যকে লিখতে এবং তারপরে অন্য সদস্যের মাধ্যমে এটি পরিদর্শন করে। এই ধরণের মেমরি পুনরায় ব্যাখ্যা (ওরফে "টাইপ পেনিং") ইউনিয়নগুলির বৈধ ব্যবহার নয়। এটি সাধারণত অপরিশোধিত আচরণের দিকে পরিচালিত করে C89 / 90-এ বাস্তবায়ন-সংজ্ঞায়িত আচরণ উত্পাদন হিসাবে বর্ণনা করা হয়।

সম্পাদনা: টাইপ পেনিংয়ের উদ্দেশ্যে ইউনিয়নগুলি ব্যবহার করে (অর্থাত্ একটি সদস্য লেখার পরে অন্যজনকে পড়ার জন্য) প্রযুক্তিগত কর্পারঞ্জের একটিতে C99 স্ট্যান্ডার্ডকে আরও বিস্তারিত সংজ্ঞা দেওয়া হয়েছিল (দেখুন DR # 257 এবং DR # 283 )। তবে, মনে রাখবেন যে আনুষ্ঠানিকভাবে এটি ট্র্যাপের উপস্থাপনাটি পড়ার চেষ্টা করে অনির্ধারিত আচরণের দিকে চালিত হতে আপনাকে রক্ষা করে না।


37
বিস্তৃত হওয়ার জন্য +1, একটি সাধারণ ব্যবহারিক উদাহরণ দেওয়া এবং ইউনিয়নের উত্তরাধিকার সম্পর্কে বলার জন্য!
কিংবদন্তি

6
এই উত্তরটির সাথে আমার যে সমস্যাটি রয়েছে তা হ'ল আমি দেখেছি বেশিরভাগ ওএসের শিরোনাম ফাইল রয়েছে যা এই সঠিক কাজটি করে। উদাহরণস্বরূপ, আমি এটি <time.h>উইন্ডোজ এবং ইউনিক্স উভয়ই পুরানো (প্রাক-64-বিট) সংস্করণে দেখেছি । এটিকে "বৈধ নয়" এবং "অপরিজ্ঞাত" হিসাবে বাতিল করা আসলেই যথেষ্ট নয় যদি আমাকে এই সঠিক পথে কাজ করে এমন কোড বোঝার জন্য আহ্বান জানানো হয় to
টেড

31
@ অ্যান্ড্রেটি “খুব সম্প্রতি অবধি ইউনিয়নগুলি ধরণের শাস্তির জন্য ব্যবহার করা আইনসম্মত ছিল না”: ২০০৪ “খুব সাম্প্রতিক” নয়, বিশেষত বিবেচনা করে যে এটি কেবল C99 যা প্রাথমিকভাবে আঠার মতো শব্দযুক্ত ছিল, এটি ইউনিয়নগুলির মাধ্যমে টাইপ-পাঞ্জিং অপরিবর্তিত বলে মনে হয়েছিল। বাস্তবে, ইউনিয়নগুলি C89 তে আইনী, সি 11-তে আইনী হলেও টাইপ-পাঞ্জিং আইনসম্মত ছিল, যদিও এটি 2004 সালে কমিটিকে ভুল শব্দের সংশোধন, এবং পরবর্তীকালে টিসি 3 প্রকাশের জন্য লেগেছে। ওপেন-std.org/jtc1/sc22/wg14/www/docs/dr_283.htm
পাস্কেল কুয়াক

6
@ কিংবদন্তি 2 কে প্রোগ্রামিং ভাষা মান দ্বারা সংজ্ঞায়িত করা হয়। সি 99 স্ট্যান্ডার্ডের টেকনিক্যাল কোরিয়েনডাম 3 স্পষ্টভাবে এর পাদটীকা 82 এ টাইপ-পানিংয়ের অনুমতি দেয়, যা আমি আপনাকে নিজের জন্য পড়ার জন্য আমন্ত্রণ জানাচ্ছি। এটি এমন টিভি নয় যেখানে রক তারকাদের সাক্ষাত্কার দেওয়া হয় এবং জলবায়ু পরিবর্তন সম্পর্কে তাদের মতামত প্রকাশ করা হয়। সি স্ট্যান্ডার্ড যা বলে তাতে স্ট্রস্ট্রপের মতামতের শূন্য প্রভাব রয়েছে influence
পাস্কেল কুয়াক

6
@ কিংবদন্তি 2 কে " আমি জানি যে কোনও ব্যক্তির মতামত কিছু যায় আসে না এবং কেবল মানদণ্ডই করে " সংকলক লেখকদের মতামত (অত্যন্ত দরিদ্র) ভাষার "স্পেসিফিকেশন" এর চেয়ে অনেক বেশি গুরুত্বপূর্ণ।
কৌতূহলী

38

আপনি নিম্নলিখিতগুলির মতো স্ট্রাক্ট তৈরি করতে ইউনিয়নগুলি ব্যবহার করতে পারেন, এতে একটি ক্ষেত্র রয়েছে যা ইউনিয়নটির কোন উপাদানটি আসলে ব্যবহৃত হয় তা আমাদের জানিয়ে দেয়:

struct VAROBJECT
{
    enum o_t { Int, Double, String } objectType;

    union
    {
        int intValue;
        double dblValue;
        char *strValue;
    } value;
} object;

আমি সম্পূর্ণরূপে সম্মতি জানাই, অপরিজ্ঞাত-আচরণ বিশৃঙ্খলা প্রবেশ না করেই সম্ভবত ইউনিয়নগুলির এটিই সর্বোত্তম উদ্দেশ্য যা আমি ভাবতে পারি; তবে যখন কেবলমাত্র 10 টি আইটেমের আইটেমটি ব্যবহার করা, বলুন intবা ব্যবহার করতে যাচ্ছি তখন স্থান নষ্ট হবে না char*; কোন ক্ষেত্রে, আমি VAROBJECT এর পরিবর্তে প্রতিটি ডেটা টাইপের জন্য পৃথক স্ট্রাক্ট বলতে পারি? এটি কি বিশৃঙ্খলা হ্রাস এবং কম স্থান ব্যবহার করবে না?
কিংবদন্তি

3
কিংবদন্তি: কিছু ক্ষেত্রে, আপনি কেবল এটি করতে পারবেন না। আপনি জাভাতে অবজেক্ট ব্যবহার করার সময় আপনি একই ক্ষেত্রে সিটিতে VAROBJECT এর মতো কিছু ব্যবহার করেন।
এরিচ কিটজমুয়েলার

আপনি ব্যাখ্যা হিসাবে ট্যাগ ইউনিয়নগুলির ডেটা কাঠামোটি ইউনিয়নগুলির একমাত্র বৈধ ব্যবহার বলে মনে হচ্ছে।
কিংবদন্তি 2 কে

মানগুলি কীভাবে ব্যবহার করতে হয় তার একটি উদাহরণও দিন।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

1
@ সিরোস্যান্টিলি 新疆 改造 中心 六四 事件C সি ++ প্রিমিয়ারের উদাহরণের একটি অংশ সাহায্য করতে পারে। wandbox.org/perMLink/cFSrXyG02vOSdBk2
রিক

34

আচরণটি ভাষার দৃষ্টিকোণ থেকে অপরিজ্ঞাত। বিবেচনা করুন যে বিভিন্ন প্ল্যাটফর্মের মেমরি প্রান্তিককরণ এবং প্রান্তিককরণের ক্ষেত্রে বিভিন্ন বাধা থাকতে পারে। একটি বড় এন্ডিয়ান বনাম সামান্য এন্ডিয়ান মেশিনের কোডটি স্ট্রাক্টের মানগুলি আলাদাভাবে আপডেট করবে। ভাষাতে আচরণটি স্থির করার জন্য একই পরিণতি (এবং মেমরির প্রান্তিককরণের সীমাবদ্ধতা ...) ব্যবহার সীমিত করার জন্য সমস্ত প্রয়োগকরণ প্রয়োজন।

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

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


পরিষ্কার এবং সহজ জবাবের জন্য +1! আমি সম্মত, বহনযোগ্যতার জন্য, আপনি দ্বিতীয় প্যারাতে যে পদ্ধতিটি দিয়েছেন তা ভাল রয়েছে; তবে আমি কীভাবে প্রশ্নটিতে ফেলেছি তা যদি আমি ব্যবহার করতে পারি তবে যদি আমার কোডটি কোনও একক স্থাপত্যের সাথে আবদ্ধ থাকে (প্রতিরোধের মূল্য প্রদান করে), যেহেতু এটি প্রতিটি পিক্সেলের মানের জন্য 4 বাইট সংরক্ষণ করে এবং সেই ফাংশনটি চালানোর ক্ষেত্রে কিছুটা সময় সাশ্রয় করে ?
কিংবদন্তি

এন্ডিয়ান ইস্যুটি স্ট্যান্ডার্ডকে এটিকে অপরিজ্ঞাত আচরণ হিসাবে ঘোষণা করতে বাধ্য করে না - পুনরায় সংজ্ঞা_কাস্টের ঠিক একই রকম ইন্ডিয়ান সমস্যা রয়েছে তবে এর বাস্তবায়ন সংজ্ঞায়িত আচরণ রয়েছে।
জোজি

1
@ কিংবদন্তি 2k, সমস্যাটি হ'ল অপটিমাইজারটি ধরে নিতে পারে যে একটি uint8_t লিখে একটি uint32_t পরিবর্তন করা হয়নি এবং সুতরাং যখন আপনি এই অনুমানটি অপ্টিমাইজড ব্যবহার করবেন তখন আপনি ভুল মান পাবেন ... @ জো, আপনি অ্যাক্সেস করার সাথে সাথেই অপরিজ্ঞাত আচরণটি উপস্থিত হবে পয়েন্টার (আমি জানি, কিছু ব্যতিক্রম আছে)।
এপ্রোগ্রামার

1
@ লেজেন্ডস ২ কে / এপ্রোগ্রামার: একটি পুনরায় ব্যাখ্যা_কাস্টের ফলাফল বাস্তবায়ন সংজ্ঞায়িত করা হয়। ফিরে আসা পয়েন্টারটি ব্যবহারের ফলে অনির্ধারিত আচরণের ফলাফল হয় না, কেবল বাস্তবায়িত সংজ্ঞায়িত আচরণে। অন্য কথায়, আচরণটি অবশ্যই সংবেদনশীল এবং সংজ্ঞায়িত হওয়া উচিত তবে এটি বহনযোগ্য নয়।
জোজি

1
@ লেজেন্ডস 2 কে: যে কোনও শালীন অপ্টিমাইজার বিটওয়াইজ অপারেশনগুলি সনাক্ত করতে পারে যা একটি সম্পূর্ণ বাইট নির্বাচন করে এবং বাইটটি পড়তে / লিখতে কোড উত্পন্ন করে, ইউনিয়নের মতো তবে সুস্পষ্টভাবে সংজ্ঞায়িত (এবং বহনযোগ্য)। যেমন uint8_t getRed () কনস্ট {রিটার্ন কালার & 0x000000FF; } শূন্য সেটরেড (uint8_t r) {color = (রঙ & x 0x000000FF) | দ; }
বেন ভয়েগ্ট

22

আমি নিয়মিত আসার সবচেয়ে সাধারণ ব্যবহার unionহ'ল এলিয়াসিং

নিম্নোক্ত বিবেচনা কর:

union Vector3f
{
  struct{ float x,y,z ; } ;
  float elts[3];
}

এটি কি করে? এটি কোনওVector3f vec; সদস্যের দ্বারা সদস্যদের পরিষ্কার, ঝরঝরে অ্যাক্সেসের অনুমতি দেয় :

vec.x=vec.y=vec.z=1.f ;

বা অ্যারেতে পূর্ণসংখ্যার অ্যাক্সেসের মাধ্যমে

for( int i = 0 ; i < 3 ; i++ )
  vec.elts[i]=1.f;

কিছু ক্ষেত্রে, নাম দ্বারা অ্যাক্সেস করা আপনার পক্ষে পরিষ্কার কাজ। অন্যান্য ক্ষেত্রে, বিশেষত অক্ষটি যখন প্রোগ্রামিকভাবে বেছে নেওয়া হয়, তখন কাজটি করার জন্য সহজ কাজটি হ'ল অক্ষকে অংকটি সূচক দ্বারা অ্যাক্সেস করা - x এর জন্য 0, y এর জন্য 1, এবং z এর জন্য 2।


3
এটিকে বলা হয় type-punningযা প্রশ্নের মধ্যেও উল্লেখ করা হয়েছে। এছাড়াও প্রশ্নের উদাহরণ একই ধরণের উদাহরণ দেখায়।
কিংবদন্তি

4
এটি পাঞ্জা টাইপ নয়। আমার উদাহরণে প্রকারগুলি মিলছে , সুতরাং "পাং" নেই, এটি কেবলমাত্র এলিয়াসিং।
বোবোবো

3
হ্যাঁ, তবে তবুও, ভাষা স্ট্যান্ডার্ডের এক নিখুঁত দৃষ্টিকোণ থেকে, লিখিত এবং পাঠানো সদস্যটি আলাদা, যা প্রশ্নের বর্ণনায় বর্ণিত নয়।
কিংবদন্তি 2 কে

3
আমি আশা করব যে ভবিষ্যতের মানদণ্ড "সাধারণ প্রাথমিক অনুচ্ছেদ" নিয়মের আওতায় অনুমোদিত হওয়ার জন্য এই বিশেষ কেসটিকে ঠিক করবে। তবে অ্যারে বর্তমান শব্দটির অধীনে সেই নিয়মে অংশ নেয় না।
বেন ভয়েগট

3
@ কুরিয়াসগুয়ে: কাঠামোর সদস্যদের নির্বিচারে প্যাডিং না করে রাখার কোনও স্পষ্টভাবে কোনও প্রয়োজন নেই। কাঠামো-সদস্য স্থাপনের জন্য বা কাঠামোর আকারের জন্য কোড পরীক্ষা করা থাকলে, ইউনিয়নের মাধ্যমে সরাসরি প্রবেশাধিকার করা হলে কোডটি কাজ করা উচিত, তবে স্ট্যান্ডার্ডের কঠোর পাঠ দ্বারা ইঙ্গিত দেওয়া হবে যে কোনও ইউনিয়ন বা কাঠামোর সদস্যের ঠিকানা নিলে একটি পয়েন্টার পাওয়া যায় যা ব্যবহার করা যায় না নিজস্ব প্রকারের পয়েন্টার হিসাবে, তবে প্রথমে এনকোলেসিং টাইপ বা একটি চরিত্রের ধরণে ফিরে যেতে হবে। যে কোনও দূরবর্তীভাবে কার্যকর-সংযোজক সংকলক ভাষাটির চেয়ে আরও বেশি জিনিস তৈরি করে ভাষাকে প্রসারিত করবে ...
সুপারক্যাট

10

আপনি যেমনটি বলেছেন, এটি কঠোরভাবে সংজ্ঞায়িত আচরণ, যদিও এটি অনেক প্ল্যাটফর্মে "কাজ" করবে। ইউনিয়নগুলি ব্যবহারের আসল কারণ হ'ল বৈকল্পিক রেকর্ড তৈরি করা।

union A {
   int i;
   double d;
};

A a[10];    // records in "a" can be either ints or doubles 
a[0].i = 42;
a[1].d = 1.23;

অবশ্যই, আপনার বৈকল্পিকটি কী রয়েছে তা বলতে কোনও ধরণের বৈষম্যমূলক প্রয়োজন। এবং মনে রাখবেন যে সি ++ ইউনিয়নগুলিতে খুব বেশি ব্যবহার হয় না কারণ এগুলিতে কেবল POD প্রকার থাকতে পারে - কার্যকরীভাবে যারা কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর ছাড়াই থাকে।


আপনি কি এইভাবে ব্যবহার করেছেন (প্রশ্নের মতো) ?? :)
কিংবদন্তি

এটি কিছুটা পেডেন্টিক, তবে আমি "বৈকল্পিক রেকর্ডস" পুরোপুরি গ্রহণ করি না। এটি হ'ল আমি নিশ্চিত যে তারা মনে রেখেছে, তবে তারা যদি অগ্রাধিকার পায় তবে কেন তাদের সরবরাহ করছিল না? "বিল্ডিং ব্লক সরবরাহ করুন কারণ এটি অন্যান্য জিনিসগুলিও তৈরি করতে কার্যকর হতে পারে" কেবল স্বজ্ঞাতভাবে সম্ভবত আরও বেশি সম্ভবত বলে মনে হয়। বিশেষত কমপক্ষে আরও একটি অ্যাপ্লিকেশন দেওয়া হয়েছে যা সম্ভবত মনে ছিল - মেমরি ম্যাপ করা আই / ও রেজিস্টার, যেখানে ইনপুট এবং আউটপুট রেজিস্টারগুলি (ওভারল্যাপ করা থাকে) তাদের নিজস্ব নাম, প্রকার ইত্যাদির সাথে স্বতন্ত্র সত্তা
স্টিভ 314

@ স্টিভ 314 যদি তাদের মনে মনে এটি ব্যবহার করা হত তবে তারা এটিকে অপরিজ্ঞাত আচরণ না করে তৈরি করতে পারত।

@ নীল: অপরিবর্তিত আচরণকে আঘাত না করেই আসল ব্যবহার সম্পর্কে প্রথমে বলার জন্য +1। আমি অনুমান করি যে তারা এটিকে বাস্তবায়নকে অন্য ধরণের পাপিং অপারেশনের (সংজ্ঞাবদ্ধকরণ_কাস্ট ইত্যাদি) হিসাবে সংজ্ঞায়িত করতে পারত। তবে আমি যেমন জিজ্ঞাসা করেছি, আপনি কি টাইপ-পেনিংয়ের জন্য ব্যবহার করেছেন?
কিংবদন্তি

@ নীল - মেমরি-ম্যাপযুক্ত নিবন্ধের উদাহরণটি পূর্বনির্ধারিত নয়, সাধারণ এন্ডিয়ান / ইত্যাদি একপাশে রেখে একটি "অস্থির" পতাকা দেওয়া হয়েছে। এই মডেলটিতে কোনও ঠিকানায় লেখা একই ঠিকানাটি পড়ার মতো একই রেজিস্টারকে উল্লেখ করে না। অতএব, "আপনি কী আবার পড়ছেন" সমস্যা নেই কারণ আপনি পিছনে পড়ছেন না - আপনি যে ঠিকানায় এই আউটপুটটি লিখেছিলেন, যখন আপনি পড়েন আপনি কেবল একটি স্বাধীন ইনপুট পড়ছেন reading একমাত্র ইস্যুটি নিশ্চিত করছে যে আপনি ইউনিয়নের ইনপুট দিকটি পড়েছেন এবং আউটপুট দিকটি লিখেছেন। এম্বেড থাকা স্টাফগুলিতে সাধারণ ছিল - সম্ভবত এখনও রয়েছে।
স্টিভ 314

8

সিতে এটি ভেরিয়েন্টের মতো কিছু বাস্তবায়নের একটি দুর্দান্ত উপায় ছিল।

enum possibleTypes{
  eInt,
  eDouble,
  eChar
}


struct Value{

    union Value {
      int iVal_;
      double dval;
      char cVal;
    } value_;
    possibleTypes discriminator_;
} 

switch(val.discriminator_)
{
  case eInt: val.value_.iVal_; break;

লিটল মেমরির সময়ে এই কাঠামোটি এমন স্ট্রাক্টের চেয়ে কম সদস্য ব্যবহার করে যা সমস্ত সদস্য থাকে।

সি প্রদান করে

    typedef struct {
      unsigned int mantissa_low:32;      //mantissa
      unsigned int mantissa_high:20;
      unsigned int exponent:11;         //exponent
      unsigned int sign:1;
    } realVal;

বিট মান অ্যাক্সেস করতে।


যদিও আপনার দুটি উদাহরণই পুরোপুরি স্ট্যান্ডার্ডে সংজ্ঞায়িত হয়েছে; কিন্তু, আরে, বিট ফিল্ডগুলি ব্যবহার করা নিশ্চিত যে অযোগ্যযোগ্য কোডের শট রয়েছে, তাই না?
কিংবদন্তি

না এটা না। যতদূর আমি জানি এটির ব্যাপক সমর্থন রয়েছে।
টোটোঙ্গা

1
সংকলক সমর্থন পোর্টেবল অনুবাদ করে না। সি বুক : সি (এর মাধ্যমে সি ++) মেশিনের শব্দের মধ্যে ক্ষেত্রগুলির ক্রমগুলির কোনও গ্যারান্টি দেয় না, সুতরাং আপনি যদি পরবর্তী কারণগুলির জন্য এটি ব্যবহার করেন, আপনি প্রোগ্রামটি কেবল অ-বহনযোগ্য হবে না, এটি সংকলক নির্ভরও হবে।
কিংবদন্তি

5

যদিও এটি কঠোরভাবে সংজ্ঞায়িত আচরণ, বাস্তবে এটি কোনও সংকলক সহ বেশ কার্যকর হবে। এটি এমন একটি বহুল ব্যবহৃত দৃষ্টান্ত যে কোনও স্ব-সম্মানজনক সংকলককে এই জাতীয় ক্ষেত্রে "সঠিক জিনিস" করতে হবে। এটি অবশ্যই টাইপ-পেনিংয়ের চেয়ে বেশি পছন্দ করা উচিত, যা কিছু সংকলকগুলির সাথে ভালভাবে ভাঙা কোড তৈরি করতে পারে।


2
এন্ডিয়ান সমস্যা নেই? "অপরিজ্ঞাত" এর তুলনায় তুলনামূলকভাবে সহজ ফিক্স, তবে কিছু প্রকল্পের জন্য যদি তা বিবেচনায় নেওয়া মূল্যবান।
স্টিভ 314

5

সি ++ এ, ভেরিয়েন্ট বুস্ট করুন ইউনিয়নটির নিরাপদ সংস্করণ প্রয়োগ করে, যতটা সম্ভব অপরিজ্ঞাত আচরণ রোধ করার জন্য ডিজাইন করা হয়েছে।

এর পারফরম্যান্সগুলি enum + unionনির্মাণের মতো (স্ট্যাক বরাদ্দ খুব বেশি) তবে এটি প্রকারের পরিবর্তে একটি টেম্পলেট তালিকা ব্যবহার করে enum:)


5

আচরণটি সংজ্ঞায়িত হতে পারে তবে এর অর্থ হ'ল একটি "মান" নেই। সমস্ত শালীন সংকলক # পরীক্ষাগার অফার করে প্যাকিং এবং প্রান্তিককরণ নিয়ন্ত্রণ করতে তবে এতে ভিন্ন ভিন্ন ডিফল্ট থাকতে পারে। ব্যবহৃত অপটিমাইজেশন সেটিংসের উপর নির্ভর করে ডিফল্টগুলিও পরিবর্তিত হবে।

এছাড়াও, ইউনিয়নগুলি কেবল স্থান বাঁচানোর জন্য নয় । তারা টাইপ পেনিং সহ আধুনিক সংকলকগুলিকে সহায়তা করতে পারে। যদি আপনি reinterpret_cast<>সবকিছু করেন তবে সংকলক আপনি কী করছেন সে সম্পর্কে অনুমান করতে পারে না। এটি আপনার টাইপ সম্পর্কে যা জানে তা ফেলে দিতে হবে এবং আবার শুরু করতে হবে (কোনও লেখাকে মেমোরিতে ফিরিয়ে দিতে বাধ্য করা হবে, যা এই দিন সিপিইউ ঘড়ির গতির তুলনায় খুব অকার্যকর)।


4

প্রযুক্তিগতভাবে এটি অপরিজ্ঞাত, তবে বাস্তবে বেশিরভাগ (সমস্ত?) সংকলকরা একে reinterpret_castএকে অন্য ধরণের ব্যবহার করে ঠিক একইরকম আচরণ করে যার ফলস্বরূপ বাস্তবায়ন সংজ্ঞায়িত হয়। আমি আপনার বর্তমান কোড নিদ্রা হারাতে হবে না।


" একটি পুনরায় ব্যাখ্যা_কাস্ট এক ধরণের থেকে অন্য ধরণের, যার ফলাফল বাস্তবায়ন সংজ্ঞায়িত is " না, এটি নয় is বাস্তবায়নগুলি এটি সংজ্ঞায়িত করতে হবে না এবং বেশিরভাগ এটির সংজ্ঞা দেয় না। এছাড়াও, কোনও পয়েন্টারে কিছু এলোমেলো মান ingালাইয়ের অনুমোদিত প্রয়োগের সংজ্ঞায়িত আচরণ কী হবে?
কৌতূহলী

4

ইউনিয়নের প্রকৃত ব্যবহারের আরও একটি উদাহরণের জন্য, CORBA কাঠামো ট্যাগ ইউনিয়ন পদ্ধতির ব্যবহার করে অবজেক্টকে সিরিয়ালাইজ করে। সমস্ত ব্যবহারকারী-সংজ্ঞায়িত শ্রেণিগুলি একটি (বিশাল) ইউনিয়নের সদস্য এবং একটি পূর্ণসংখ্যা শনাক্তকারী কীভাবে ইউনিয়নটির ব্যাখ্যা করতে হয় তা ডিমারশালারকে বলে।


4

অন্যরা স্থাপত্যের পার্থক্যগুলি উল্লেখ করেছেন (ছোট - বড় এন্ডিয়ান)।

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

যেমন। ইউনিয়ন {ভাসা চ; int i; } এক্স;

আপনি যদি এক্সএফ থেকে পড়েন তবে Xi- তে লেখা অর্থহীন হবে - যদি না আপনি ভাসমানের সাইন, ঘনিষ্টর বা ম্যান্টিসার উপাদানগুলি দেখার জন্য লক্ষ্য রেখেছিলেন unless

আমি মনে করি প্রান্তিককরণের একটি সমস্যাও রয়েছে: কিছু ভেরিয়েবলগুলি অবশ্যই শব্দ প্রান্তিকভাবে সংযোজন করা উচিত তবে আপনি সম্ভবত প্রত্যাশিত ফলাফলটি পাবেন না।

যেমন। ইউনিয়ন {চর সি [4]; int i; } এক্স;

যদি, হাইপোথিটিক্যালি, কোনও মেশিনে একটি চরকে একত্রিত করতে হয় তবে সি [0] এবং সি [1] i এর সাথে স্টোরেজ ভাগ করে তবে সি [2] এবং সি [3] না।


একটি বাইট যা শব্দ প্রান্তিককরণ করতে হবে? ওটা কোন অর্থ প্রকাশ করে না. সংজ্ঞা অনুসারে একটি বাইটের কোনও প্রান্তিককরণের প্রয়োজন নেই।
কৌতূহলী

হ্যাঁ, আমার সম্ভবত আরও ভাল উদাহরণ ব্যবহার করা উচিত ছিল। ধন্যবাদ।
ফিলক্লাবর্ন

@ কুরিয়াসগুই: এমন অনেকগুলি ক্ষেত্রে রয়েছে যেখানে কেউ বাইটের অ্যারেগুলি শব্দ সংযোজন করতে চান। যদি একটির যেমন 1024 বাইটের অনেকগুলি অ্যারে থাকে এবং ঘন ঘন একে অপরের কাছে অনুলিপি করতে চান, তাদের শব্দ সংযুক্ত করে অনেক সিস্টেমে memcpy()একের অপর গতি দ্বিগুণ করতে পারে। কিছু সিস্টেম সম্ভবত এবং অন্যান্য কারণে কাঠামো / ইউনিয়নের বাইরে ঘটে এমনchar[] বরাদ্দগুলিকে অনুমানমূলকভাবে সারিবদ্ধ করতে পারে । বিদ্যমান উদাহরণে, অনুমান যে iউপাদানগুলির জন্য সমস্ত ওভারল্যাপ করবে c[]অ-বহনযোগ্য, তবে এটির কোনও গ্যারান্টি নেই বলেই sizeof(int)==4
সুপারক্যাট

4

1974 সালে নথিবদ্ধ হিসাবে সি ভাষায়, সমস্ত কাঠামোর সদস্যরা একটি সাধারণ নাম স্থান ভাগ করে নিয়েছিল এবং "পিটিআর-> সদস্য" এর অর্থ সংজ্ঞা দেওয়া হয়েছিল সদস্যের স্থানচ্যুতি যুক্ত এবং সদস্যের ব্যবহার করে ফলাফলের ঠিকানাটি অ্যাক্সেস হিসাবে করা । এই নকশাটি বিভিন্ন কাঠামোগত সংজ্ঞা থেকে নেওয়া একই নামের সদস্যদের সাথে একই অফসেটের সাথে একই পিটিআর ব্যবহার করা সম্ভব করেছে; প্রোগ্রামাররা বিভিন্নভাবে বিভিন্ন কারণে সেই ক্ষমতা ব্যবহার করে।

যখন কাঠামোর সদস্যদের তাদের নিজস্ব নামস্থান নির্ধারণ করা হয়, তখন একই স্থানচ্যুতি সহ দুটি কাঠামোর সদস্য ঘোষণা করা অসম্ভব হয়ে পড়েছিল। ভাষার ইউনিয়ন যুক্ত করার ফলে ভাষার আগের সংস্করণগুলিতে একই শব্দার্থকগুলি পাওয়া সম্ভব হয়েছিল (যদিও নামটি কোনও ঘেরের প্রসঙ্গে রফতানি করতে অক্ষমতা এখনও foo-> সদস্যকে প্রতিস্থাপনের জন্য অনুসন্ধান / প্রতিস্থাপনের প্রয়োজন হতে পারে foo-> টাইপ 1. মেম্বারে)। গুরুত্বপূর্ণ বিষয়টি এতটা গুরুত্বপূর্ণ ছিল না যে ইউনিয়নগুলি যুক্ত করা লোকদের মনে কোনও নির্দিষ্ট লক্ষ্য ব্যবহার রয়েছে, বরং তারা এমন একটি উপায় সরবরাহ করেছিল যার মাধ্যমে প্রোগ্রামাররা যা পূর্ববর্তী শব্দার্থবিজ্ঞানের উপর নির্ভর করেছিল, যে কোনও উদ্দেশ্যেই এখনও অর্জন করতে সক্ষম হওয়া উচিত একই শব্দার্থক এমনকি এটি করার জন্য যদি তাদের আলাদা সিনট্যাক্স ব্যবহার করতে হয়।


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

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

2
... আরও অনেক নতুন উদ্ভাবন মনে হচ্ছে। এই সমস্তগুলির জন্য বিশেষত দুঃখজনক বিষয়টি হ'ল উচ্চ-প্রান্তের অ্যাপ্লিকেশনগুলিকে টার্গেট করে সংকলক লেখকরা যদি "কেবলমাত্র" দ্বারা সমর্থিত গোটিং বৈশিষ্ট্য এবং গ্যারান্টি না দিয়ে 1990 এর দশকে কার্যকর হওয়া সবচেয়ে কম্পাইলারগুলিতে কীভাবে দরকারী অপ্টিমাইজেশন নির্দেশিকা যুক্ত করতে পারেন তা নির্ধারণ করা হত "90% বাস্তবায়নের ফলে ফলাফলটি এমন একটি ভাষা হতে পারে যা হাইপার-আধুনিক সি এর চেয়ে আরও ভাল এবং নির্ভরযোগ্যতার সাথে পারফর্ম করতে পারে
সুপারক্যাট

2

আপনি দুটি মূল কারণে আ ইউনিয়ন ব্যবহার করতে পারেন :

  1. আপনার উদাহরণের মতো একই উপায়ে একই উপায়ে অ্যাক্সেস করার একটি সহজ উপায়
  2. স্থান সংরক্ষণের একটি উপায় যখন বিভিন্ন ডেটা সদস্য থাকে যার মধ্যে কেবলমাত্র একজনই 'সক্রিয়' থাকতে পারে

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

2. একটি ভাল উদাহরণ খুঁজে পাওয়া যেতে পারে বৈকল্পিক এর COM মধ্যে ব্যাপকভাবে ব্যবহৃত প্রকার।


2

অন্যরা যেমন উল্লেখ করেছেন, ইউনিয়নগুলি গণনাগুলির সাথে মিলিত হয়ে স্ট্রাক্টগুলিতে আবৃত থাকে তা ট্যাগ ইউনিয়নগুলি প্রয়োগ করতে ব্যবহার করা যেতে পারে। একটি ব্যবহারিক ব্যবহার হ'ল মরিচা বাস্তবায়ন Result<T, E>, যা মূলত একটি খাঁটি ব্যবহার করে প্রয়োগ করা হয় enum(মরিচটি গণনার বৈকল্পগুলিতে অতিরিক্ত ডেটা ধরে রাখতে পারে)। এখানে একটি সি ++ উদাহরণ রয়েছে:

template <typename T, typename E> struct Result {
    public:
    enum class Success : uint8_t { Ok, Err };
    Result(T val) {
        m_success = Success::Ok;
        m_value.ok = val;
    }
    Result(E val) {
        m_success = Success::Err;
        m_value.err = val;
    }
    inline bool operator==(const Result& other) {
        return other.m_success == this->m_success;
    }
    inline bool operator!=(const Result& other) {
        return other.m_success != this->m_success;
    }
    inline T expect(const char* errorMsg) {
        if (m_success == Success::Err) throw errorMsg;
        else return m_value.ok;
    }
    inline bool is_ok() {
        return m_success == Success::Ok;
    }
    inline bool is_err() {
        return m_success == Success::Err;
    }
    inline const T* ok() {
        if (is_ok()) return m_value.ok;
        else return nullptr;
    }
    inline const T* err() {
        if (is_err()) return m_value.err;
        else return nullptr;
    }

    // Other methods from https://doc.rust-lang.org/std/result/enum.Result.html

    private:
    Success m_success;
    union _val_t { T ok; E err; } m_value;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.