C ++ এ এনামের জন্য কীভাবে কাস্ট করবেন?


222

আমি কীভাবে সি ++ তে একটি এনামের জন্য একটি ইন্টার প্যাস্ট করব?

উদাহরণ স্বরূপ:

enum Test
{
    A, B
};

int a = 1;

আমি কীভাবে aটাইপে রূপান্তর করব Test::A?


1
লিঙ্ক নোট করুন যে এনাম টাইপের ধ্রুবকের সাথে কোনটি ইন্ট্রি মেলে কিনা তা বিবেচ্য নয়; ধরণের রূপান্তরটি সর্বদা অবৈধ।
ইওয়াজ

3
আমি বিশ্বাস করি যে আপনি যদি টেস্টে কাস্ট করতে চান তবে :: A এর মান int a0 হতে হবে, কারণ টেস্ট :: এ এর ​​0 এবং টেস্টের বিহিত মান আছে: বি এর 1 এর অন্তর্নিহিত মান রয়েছে 1 বিশেষত টেস্ট করার জন্য :: এ বিন্দু ছাড়াও ...
জনআরডিআরজিও

উত্তর:


243
int i = 1;
Test val = static_cast<Test>(i);

21
অটো ভাল = স্ট্যাটিক_কাস্ট <পরীক্ষা> (i); // সি ++ 11
ম্যাচ

3
@ মিচ autoএই ক্ষেত্রে আমি কী ব্যবহার করব ? কোন কর্মক্ষমতা উন্নতি আছে?
ফ্রেডেরিকো পান্টুজা

2
কার্য সম্পাদনের কোনও উন্নতি নেই। আপনি যদি "অটো" দিয়ে নির্দিষ্ট করেন তবে সংকলক কেবল স্বয়ংক্রিয়ভাবে প্রকারটি হ্রাস করে। যদি আপনি ভবিষ্যতে আপনার এনামের নাম পরিবর্তন করার সিদ্ধান্ত নেন, আপনি কম কোডটি সংশোধন করবেন কারণ সংকলক স্বয়ংক্রিয়ভাবে সঠিক টাইপের নামটি কেটে নেবে।
আয়দিন Özcan

74
Test e = static_cast<Test>(1);

10
এমএসডিএন: স্ট্যাটিক_কাস্ট অপারেটর স্পষ্টরূপে একটি অবিচ্ছেদ্য মানকে একটি গণনা প্রকারে রূপান্তর করতে পারে। যদি অবিচ্ছেদ্য প্রকারের মান গণনা মানগুলির সীমার মধ্যে না পড়ে, তবে ফলস্বরূপ গণনা মানটি সংজ্ঞায়িত হয়।
কিরিল কোবেলেভ

1
@ কিরিলকোলেভ যদি অবিচ্ছেদ্য মানটি এনামের অন্তর্নিহিত ধরণের দ্বারা প্রতিনিধিত্ব করা যায় তবে ফলাফলযুক্ত এনামের অবশ্যই সেই মান থাকতে হবে। অন্যথায় উত্পাদিত এনাম মানটি এনামের অন্তর্নিহিত প্রকারে এক্সপ্রেশনকে রূপান্তরকরণের ফলে যে কোনও মানের ফলাফল হিসাবে আসবে। ভিসি ++ যদি আলাদা কিছু করে তবে আমার মনে হয় এটি অ-সঙ্গতিপূর্ণ।
bames53

2
কনফর্মেন্ট কম্পাইলারটি কী করবে, যদি এনামের মান {1,3,5 has থাকে এবং কোডটি <স্ট্যাটিক_কাস্ট> 2 এর মান থেকে করার চেষ্টা করে তবে কীভাবে এটি সি-কাস্ট থেকে আলাদা হবে?
কিরিল কোবেলভ

6
@ কিরিলকোলেভ আমি কোনও স্ট্যাটিক_কাস্ট ব্যবহার করছি না কারণ এটি সি স্টাইলের .ালাই থেকে আলাদা কিছু করে, আমি স্ট্যাটিক_কাস্ট ব্যবহার করছি কারণ সি ++ বর্ণগুলি স্টাইলিস্টিকালি সি বর্ণের চেয়ে পছন্দনীয়।
bames53

4
@ কিরিলকোলেভ " যদি এনামের মানগুলি থাকে {1,3,5} " না। গণনার ধরণটি কেবলমাত্র এই 3 সম্ভাব্য মানের মধ্যে সীমাবদ্ধ হতে পারে না: {1,3,5} গণনা করা হয় (নামকরণের গণনা মান), গণনা নিজেই নয় । 1,3,5 সম্ভব হন শুমার মূল্যবোধ, তারপর তাই 2. হয়
curiousguy

25

তোমার গোপন সংকেত

enum Test
{
    A, B
}

int a = 1;

সমাধান

Test castEnum = static_cast<Test>(a);

45
সংকলকটিকে ভুল সনাক্তকরণের সবচেয়ে ভাল সুযোগ দেওয়ার জন্য আপনি সবচেয়ে সীমাবদ্ধ কাস্ট ব্যবহার করতে পারেন এবং সি-স্টাইলের কাস্টগুলি পুরোপুরি এড়িয়ে চলা ভাল idea static_castএখানে একটি ভাল castালাই হবে।
মাইক সিমুর

4
@ মাইক সিমুর, সমস্যাটি হ'ল এই ক্ষেত্রে সি-কাস্ট থেকে স্ট্যাটিক কাস্টের কোনও পার্থক্য নেই। কীভাবে এবং কী ভুল সনাক্ত করতে পারে ???
কিরিল কোবেলেভ

7
@ কিরিলকোলেভ: সমস্যাটি হ'ল সি-স্টাইলের castালাই স্পষ্ট নয়। এটি একটি এর সমান static_castহতে পারে তবে এটির পাশাপাশি const_castআরও বা আরও খারাপ হতে পারে , একটি reinterpret_castবা এমনকি এর সংমিশ্রণও। এটি এখন কীভাবে হ্রাস পাবে তা যদি আপনি এখনই জানেন তবে মনে করুন আপনি aপরে অন্য ধরণের হয়ে যান তবে আপনি কোনও সতর্কতা হিসাবে যতটা না পেয়ে কাস্টিং পরিবর্তনের ধরণটি হতে পারেন তা আপনি চান না।
কিলিয়ানডিস

4
@ কিলিয়ানডিএস " ধরুন আপনি কোনও ধরণের পরে পরিবর্তন করেন " কোন ধরণের?
কৌতূহলী

2
হ্যাঁ, হয় সেগুলি হয় বা যদি উপলদ্ধ থাকে তবে অন্তর্ভুক্ত castালাই। Castালাইটির উদ্দেশ্য কী তা এটি আরও পরিষ্কার।
কিলিয়ানডিস

8

সমাপনী প্রশ্নটি Test::Aছড়িয়ে দেওয়া, সেখানে কাস্ট করার প্রয়োজনীয়তার বিষয়ে অনড় থাকার চেয়ে " আমি কীভাবে টাইপ করতে চাইছি " এবং বেশ কয়েক বছর দেরিতে উত্তর দেওয়ার পরেও এটি একটি জনপ্রিয় প্রশ্ন বলে মনে হয় অন্য কেউ বিকল্পটির উল্লেখ করেছেন বলে মনে হয় না , সি ++ 11 মান অনুযায়ী:

5.2.9 স্ট্যাটিক কাস্ট

... একটি অভিব্যক্তি e কিছু উদ্ভাবিত অস্থায়ী পরিবর্তনশীল (8.5) এর জন্য যদি ঘোষণাটি সু- গঠনযুক্ত হয় তবে একটি প্রকাশটি ফর্মের T একটি ব্যবহার করে স্পষ্টভাবে কোনও ধরণের রূপান্তরিত হতে পারে । এ জাতীয় স্পষ্ট রূপান্তরটির প্রভাব ঘোষণা এবং সূচনাকরণ সম্পাদন এবং তারপরে রূপান্তরটির ফলাফল হিসাবে অস্থায়ী পরিবর্তনশীল ব্যবহার করার মতো।static_caststatic_cast<T>(e)T t(e);t

সুতরাং সরাসরি ফর্মটি ব্যবহার t(e)করাও কাজ করবে এবং আপনি এটি ঝরঝরে জন্য পছন্দ করতে পারেন:

auto result = Test(a);

এই সমাধানটি কম্পাইলার বিকল্পের ক্ষেত্রে স্ট্যাটিক_কাস্ট <> অবরুদ্ধ করে (শব্দার্থ পরীক্ষা করে) কাজ করেছে। এটি আমার কাছে বোধগম্য নয়, তবে এখনও ঝরঝরে।
মিঃ

1

Test castEnum = static_cast<Test>(a-1);এ-তে কাস্ট করা হবে আপনি যদি 1 টি সাবস্ট্রাক্ট না চান তবে আপনি নতুন করে সংজ্ঞা দিতে পারেন enum:

enum Test
{
    A:1, B
};

এক্ষেত্রে cast পরীক্ষা castালাই এনাম = স্ট্যাটিক_কাস্ট (ক); ' একটি এ কাস্ট করতে ব্যবহৃত হতে পারে

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