একজন castালাই অপারেটর স্পষ্ট করা যেতে পারে?


84

কনস্ট্রাক্টরদের ক্ষেত্রে, কীওয়ার্ড যুক্ত করা explicitকোনও উত্সাহী সংকলককে কোনও বস্তু তৈরি থেকে বাধা দেয় যখন এটি প্রোগ্রামারের প্রথম উদ্দেশ্য ছিল না। কাস্টিং অপারেটরদের জন্যও কি এই জাতীয় ব্যবস্থা উপলব্ধ?

struct Foo
{
    operator std::string() const;
};

এখানে, উদাহরণস্বরূপ, আমি ঢালাই পাবে চাই Fooএকটি মধ্যে std::string, কিন্তু আমি পরোক্ষভাবে ঘটতে যেমন ঢালাই চাই না।

উত্তর:


101

হ্যা এবং না.

এটি নির্ভর করে যে আপনি C ++ এর কোন সংস্করণ ব্যবহার করছেন।

  • সি ++ 98 এবং সি ++ 03 explicitটাইপ রূপান্তর অপারেটরদের সমর্থন করে না
  • তবে সি ++ 11 করে।

উদাহরণ,

struct A
{
    //implicit conversion to int
    operator int() { return 100; }

    //explicit conversion to std::string
    explicit operator std::string() { return "explicit"; } 
};

int main() 
{
   A a;
   int i = a;  //ok - implicit conversion 
   std::string s = a; //error - requires explicit conversion 
}

এটি দিয়ে সংকলন করুন g++ -std=c++0x, আপনি এই ত্রুটিটি পাবেন:

prog.cpp: 13: 20: ত্রুটি: 'এ' থেকে নন-স্ক্যালার প্রকারের 'স্টাড :: স্ট্রিং' রূপান্তরকরণের অনুরোধ করা হয়েছে

অনলাইন ডেমো: http://ideone.com/DJut1

তবে যত তাড়াতাড়ি আপনি লিখেছেন:

std::string s = static_cast<std::string>(a); //ok - explicit conversion 

ত্রুটিটি চলে যায়: http://ideone.com/LhuFd

বিটিডাব্লু, সি ++ ১১-এ, সুস্পষ্ট রূপান্তর অপারেটরকে "প্রাসঙ্গিক রূপান্তর অপারেটর" হিসাবে উল্লেখ করা হয় যদি এটি বুলিয়ান রূপান্তর করে । এছাড়াও, আপনি যদি অন্তর্নিহিত এবং স্পষ্ট রূপান্তর সম্পর্কে আরও জানতে চান তবে এই বিষয়টি পড়ুন:

আশা করি এইটি কাজ করবে.


9
এমনকি সি ++ 03 তেও অন্তর্নিহিত রূপান্তর এড়ানো সহজ। toStringবরং ফাংশনটি কল করুন operator std::string। অবশ্যই এটি কিছু টেমপ্লেটগুলির সাথে সমস্যা তৈরি করতে পারে। আমি সর্বদা ব্যবহার করেছি toStringএবং এটি কখনও আমার কোনও সমস্যা তৈরি করে নি, তবে আমি ধারণা করি এটি আপনার কোডিং শৈলীর উপর নির্ভর করতে পারে।
জেমস কানজে

নিবন্ধন করুন ঠিক যেমন operator std::string():-)।
জেমস কানজে

4
আমি to_stringপরিবর্তে ব্যবহার । এটি সি ++ 11 এটিকে বলে তাই এটি সহায়তা করে, তাই এটি ফরোয়ার্ড-সামঞ্জস্যপূর্ণ কোড লিখতে সহায়তা করে এবং এটি টেমপ্লেটগুলির সাথে সহায়তা করে।
লুইস মাচুকা

4
std::string s(a)বা std::string s{a}হিসাবে কাজ করা উচিত static_cast<std::string>(a)
alfC

4
@Bin: যেহেতু explicit operator bool() প্রার্থনা করা হয় বিষয়গতভাবে কম্পাইলার দ্বারা আপনি লিখতে যখন if(std::cin)। রূপান্তর যা এখানে ঘটে (অনানুষ্ঠানিকভাবে) বলা হয় দ্রষ্টব্য প্রাসঙ্গিক রূপান্তর, না অন্তর্নিহিত রূপান্তর।
নওয়াজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.