"অপারেটর বুল () কনস্ট" এর অর্থ কী?


উত্তর:


141

ফর্মের সদস্য কার্যাদি

operator TypeName()

রূপান্তর অপারেটর হয়। তারা শ্রেণীর ধরণের অবজেক্টগুলিকে এমনভাবে ব্যবহার করতে দেয় যা তারা টাইপের ছিল TypeNameএবং যখন তারা হয়, তারা TypeNameরূপান্তর ফাংশনটি ব্যবহার করে রূপান্তরিত হয়।

এই বিশেষ ক্ষেত্রে, operator bool()বর্গ প্রকারের একটি বস্তু ব্যবহার করা যেমন যদি এটি একটি ছিল পারবেন bool। উদাহরণস্বরূপ, আপনার কাছে শ্রেণীর প্রকারের নামযুক্ত কোনও জিনিস থাকলে আপনি objএটি হিসাবে এটি ব্যবহার করতে পারেন

if (obj)

এটি কল করবে operator bool(), ফলাফলটি ফেরত দেবে এবং ফলাফলটিকে শর্ত হিসাবে ব্যবহার করবে if

এটি লক্ষ করা উচিত যে operator bool()এটি একটি খুব খারাপ ধারণা এবং আপনার সত্যই এটি কখনই ব্যবহার করা উচিত নয়। এটি কেন খারাপ তা সম্পর্কিত বিশদ ব্যাখ্যার জন্য এবং সমস্যার সমাধানের জন্য, "দ্য সেফ বুল ইডিয়াম" দেখুন।

(সি ++ 0 এক্স, সি ++ স্ট্যান্ডার্ডের আগত সংশোধন, সুস্পষ্ট রূপান্তর অপারেটরদের জন্য সমর্থন যোগ করে These এগুলি আপনাকে নিরাপদ লেখার অনুমতি দেবে explicit operator bool()যা সেফ বুল ইডিয়ম বাস্তবায়নের ফাঁকে না গিয়েই সঠিকভাবে কাজ করে))


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

4
@ টনি: আচ্ছা, এটি ব্যবহার করা যেতে পারে যেন এটি একটি বুল; যেহেতু রূপান্তরটির ফলাফলটি একটি মূল্য ( bool), না, আপনি এটি বরাদ্দ করতে পারবেন না। যদি এটি কোনও সংশোধনযোগ্য লভ্যালু (উদাঃ bool&) হয় তবে আপনি এটি নির্ধারণ করতে পারেন। শুদ্ধতার জন্য, আমি যুক্তি দিয়েছি যে একটি operator bool()সর্বদা ভুল কারণ এটি একটি শ্রেণীর ধরণের অবজেক্টকে বিপুল সংখ্যক পরিস্থিতিতে ব্যবহার করতে দেয় যেখানে আপনি কখনই এটি ব্যবহার করতে চান না। সেফ বুল একটি উচ্চতর বিকল্প।
জেমস ম্যাকনেলিস

4
সুতরাং গত অনুচ্ছেদ অনুযায়ী আজ পুরোপুরি ব্যবহার করা ঠিক আছে explicit operator bool()। আমি কি সঠিকভাবে বুঝতে পারি?
জিঙ্গাম

4
সি ++ কমিটি অপারেটর বুল () এর সাথে আপনার সাথে একমত নয় বলে মনে হচ্ছে। কমপক্ষে স্ট্যান্ডার্ডের সর্বশেষতম সংস্করণটির জন্য (উদাহরণস্বরূপ, en.cppreferences.com/w/cpp/utility/optional )। অথবা সম্ভবত আপনি বোঝাচ্ছেন যে কেবল এসটিএল কোডটি ব্যবহার করার অনুমতি দেওয়া উচিত?
জো স্টিলে

4
@JoeSteele - দেখুন stackoverflow.com/a/16615725/2492801 । সুস্পষ্ট রূপান্তর অপারেটর নিরাপদ!
বেনজামিন বিহেলার

9
operator bool() const 
{
    return col != 0;
}

শ্রেণিটি কীভাবে বুলিয়ান মানে রূপান্তরিত হয় তা সংজ্ঞায়িত করে, এর constপরে ()এই পদ্ধতিটি নির্দেশ করতে ব্যবহৃত হয় না পরিবর্তিত হয় (এই শ্রেণীর সদস্যদের পরিবর্তন করুন)।

আপনি সাধারণত নিম্নলিখিত হিসাবে এই ধরনের অপারেটর ব্যবহার করবেন:

airplaysdk sdkInstance;
if (sdkInstance) {
    std::cout << "Instance is active" << std::endl;
} else {
    std::cout << "Instance is in-active error!" << std::endl;
}

7

এটি পরিষ্কার করার জন্য আমি আরও কোড দিতে চাই।

struct A
{
    operator bool() const { return true; }
};

struct B
{
    explicit operator bool() const { return true; }
};

int main()
{
    A a1;
    if (a1) cout << "true" << endl; // OK: A::operator bool()
    bool na1 = a1; // OK: copy-initialization selects A::operator bool()
    bool na2 = static_cast<bool>(a1); // OK: static_cast performs direct-initialization

    B b1;     
    if (b1) cout << "true" << endl; // OK: B::operator bool()
    // bool nb1 = b1; // error: copy-initialization does not consider B::operator bool()
    bool nb2 = static_cast<bool>(b1); // OK: static_cast performs direct-initialization
}

3

implicitআপনার ক্লাসকে হয় trueবা তে রূপান্তর করার জন্য এটি ব্যবহারকারী-সংজ্ঞায়িত রূপান্তর ফাংশন false

//usage
bool value = yourclassinstance; //yourclassinstance is converted into bool!

1

এটিতে অন্তর্ভুক্ত রূপান্তর bool। অর্থাৎ যেখানেই অন্তর্নিহিত রূপান্তরগুলির অনুমতি রয়েছে, boolসেই পদ্ধতিটি কল করে আপনার শ্রেণিতে রূপান্তর করা যেতে পারে ।


1

অন্যরা যেমন বলেছে, এটি রূপান্তর টাইপের জন্য, এক্ষেত্রে এ bool। উদাহরণ স্বরূপ:

class A {
    bool isItSafe;

public:
    operator bool() const
    {
        return isItSafe;
    }

    ...
};

এখন আমি এই শ্রেণীর একটি অবজেক্টটি ব্যবহার করতে পারি যেন এটি একটি বুলিয়ান:

A a;
...
if (a) {
    ....
}

1

আমার নিজস্ব অনন্য_পিটার লেখার সময়, আমি এই কেসটি পেয়েছি। প্রদত্ত std::unique_ptr'soperator== :

template<class T1, class D1, class T2, class D2>
bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);

template <class T, class D>
bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept;

template <class T, class D>
bool operator==(nullptr_t, const unique_ptr<T, D>& x) noexcept;

এবং এই পরীক্ষার কেস libstdcxx থেকে :

  std::unique_ptr<int> ptr;
  if (ptr == 0)
    { }
  if (0 == ptr)
    { }
  if (ptr != 0)
    { }
  if (0 != ptr)
    { }

নোট কারণ ptrএটি একটি আছে explicit operator bool() const noexcept;, তাই operator overload resolutionএখানে সূক্ষ্মভাবে কাজ করে, উদাহরণস্বরূপ, ptr == 0চয়ন করে

 template <class T, class D>
 bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept;`.

এখানে যদি এটির কোনও explicitকীওয়ার্ড ptrনা থাকে তবেptr == 0bool তবে ইন রূপান্তরিত হবে , তবে boolরূপান্তরিত হবে int, কারণ bool operator==(int, int)এটি অন্তর্নির্মিত এবং 0রয়েছে int। আমাদের জন্য যা অপেক্ষা করছে তা অস্পষ্ট ওভারলোড রেজোলিউশন ত্রুটি।

এখানে একটি ন্যূনতম, সম্পূর্ণ এবং যাচাইযোগ্য উদাহরণ :

#include <cstddef>
struct A
{
    constexpr A(std::nullptr_t) {}
    operator bool() 
    {
        return true;
    }
};

constexpr bool operator ==(A, A) noexcept
{
    return true;
}

constexpr bool operator ==(A, std::nullptr_t) noexcept
{
    return true;
}

constexpr bool operator ==(std::nullptr_t, A) noexcept
{
    return true;
}

int main()
{
    A a1(nullptr);
    A a2(0);
    a1 == 0;
}

জিসিসি :

prog.cc: In function 'int main()':
prog.cc:30:8: error: ambiguous overload for 'operator==' (operand types are 'A' and 'int')
   30 |     a1 == 0;
      |     ~~ ^~ ~
      |     |     |
      |     A     int
prog.cc:30:8: note: candidate: 'operator==(int, int)' <built-in>
   30 |     a1 == 0;
      |     ~~~^~~~
prog.cc:11:16: note: candidate: 'constexpr bool operator==(A, A)'
   11 | constexpr bool operator ==(A, A) noexcept
      |                ^~~~~~~~
prog.cc:16:16: note: candidate: 'constexpr bool operator==(A, std::nullptr_t)'
   16 | constexpr bool operator ==(A, std::nullptr_t) noexcept
      |                ^~~~~~~~

ঝনঝনানি :

prog.cc:30:8: error: use of overloaded operator '==' is ambiguous (with operand types 'A' and 'int')
    a1 == 0;
    ~~ ^  ~
prog.cc:16:16: note: candidate function
constexpr bool operator ==(A, std::nullptr_t) noexcept
               ^
prog.cc:11:16: note: candidate function
constexpr bool operator ==(A, A) noexcept
               ^
prog.cc:30:8: note: built-in candidate operator==(int, int)
    a1 == 0;
       ^
prog.cc:30:8: note: built-in candidate operator==(float, int)
prog.cc:30:8: note: built-in candidate operator==(double, int)
prog.cc:30:8: note: built-in candidate operator==(long double, int)
prog.cc:30:8: note: built-in candidate operator==(__float128, int)
prog.cc:30:8: note: built-in candidate operator==(int, float)
prog.cc:30:8: note: built-in candidate operator==(int, double)
prog.cc:30:8: note: built-in candidate operator==(int, long double)
prog.cc:30:8: note: built-in candidate operator==(int, __float128)
prog.cc:30:8: note: built-in candidate operator==(int, long)
prog.cc:30:8: note: built-in candidate operator==(int, long long)
prog.cc:30:8: note: built-in candidate operator==(int, __int128)
prog.cc:30:8: note: built-in candidate operator==(int, unsigned int)
prog.cc:30:8: note: built-in candidate operator==(int, unsigned long)
prog.cc:30:8: note: built-in candidate operator==(int, unsigned long long)
prog.cc:30:8: note: built-in candidate operator==(int, unsigned __int128)
prog.cc:30:8: note: built-in candidate operator==(long, int)
prog.cc:30:8: note: built-in candidate operator==(long long, int)
prog.cc:30:8: note: built-in candidate operator==(__int128, int)
prog.cc:30:8: note: built-in candidate operator==(unsigned int, int)
prog.cc:30:8: note: built-in candidate operator==(unsigned long, int)
prog.cc:30:8: note: built-in candidate operator==(unsigned long long, int)
prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, int)
prog.cc:30:8: note: built-in candidate operator==(float, float)
prog.cc:30:8: note: built-in candidate operator==(float, double)
prog.cc:30:8: note: built-in candidate operator==(float, long double)
prog.cc:30:8: note: built-in candidate operator==(float, __float128)
prog.cc:30:8: note: built-in candidate operator==(float, long)
prog.cc:30:8: note: built-in candidate operator==(float, long long)
prog.cc:30:8: note: built-in candidate operator==(float, __int128)
prog.cc:30:8: note: built-in candidate operator==(float, unsigned int)
prog.cc:30:8: note: built-in candidate operator==(float, unsigned long)
prog.cc:30:8: note: built-in candidate operator==(float, unsigned long long)
prog.cc:30:8: note: built-in candidate operator==(float, unsigned __int128)
prog.cc:30:8: note: built-in candidate operator==(double, float)
prog.cc:30:8: note: built-in candidate operator==(double, double)
prog.cc:30:8: note: built-in candidate operator==(double, long double)
prog.cc:30:8: note: built-in candidate operator==(double, __float128)
prog.cc:30:8: note: built-in candidate operator==(double, long)
prog.cc:30:8: note: built-in candidate operator==(double, long long)
prog.cc:30:8: note: built-in candidate operator==(double, __int128)
prog.cc:30:8: note: built-in candidate operator==(double, unsigned int)
prog.cc:30:8: note: built-in candidate operator==(double, unsigned long)
prog.cc:30:8: note: built-in candidate operator==(double, unsigned long long)
prog.cc:30:8: note: built-in candidate operator==(double, unsigned __int128)
prog.cc:30:8: note: built-in candidate operator==(long double, float)
prog.cc:30:8: note: built-in candidate operator==(long double, double)
prog.cc:30:8: note: built-in candidate operator==(long double, long double)
prog.cc:30:8: note: built-in candidate operator==(long double, __float128)
prog.cc:30:8: note: built-in candidate operator==(long double, long)
prog.cc:30:8: note: built-in candidate operator==(long double, long long)
prog.cc:30:8: note: built-in candidate operator==(long double, __int128)
prog.cc:30:8: note: built-in candidate operator==(long double, unsigned int)
prog.cc:30:8: note: built-in candidate operator==(long double, unsigned long)
prog.cc:30:8: note: built-in candidate operator==(long double, unsigned long long)
prog.cc:30:8: note: built-in candidate operator==(long double, unsigned __int128)
prog.cc:30:8: note: built-in candidate operator==(__float128, float)
prog.cc:30:8: note: built-in candidate operator==(__float128, double)
prog.cc:30:8: note: built-in candidate operator==(__float128, long double)
prog.cc:30:8: note: built-in candidate operator==(__float128, __float128)
prog.cc:30:8: note: built-in candidate operator==(__float128, long)
prog.cc:30:8: note: built-in candidate operator==(__float128, long long)
prog.cc:30:8: note: built-in candidate operator==(__float128, __int128)
prog.cc:30:8: note: built-in candidate operator==(__float128, unsigned int)
prog.cc:30:8: note: built-in candidate operator==(__float128, unsigned long)
prog.cc:30:8: note: built-in candidate operator==(__float128, unsigned long long)
prog.cc:30:8: note: built-in candidate operator==(__float128, unsigned __int128)
prog.cc:30:8: note: built-in candidate operator==(long, float)
prog.cc:30:8: note: built-in candidate operator==(long, double)
prog.cc:30:8: note: built-in candidate operator==(long, long double)
prog.cc:30:8: note: built-in candidate operator==(long, __float128)
prog.cc:30:8: note: built-in candidate operator==(long, long)
prog.cc:30:8: note: built-in candidate operator==(long, long long)
prog.cc:30:8: note: built-in candidate operator==(long, __int128)
prog.cc:30:8: note: built-in candidate operator==(long, unsigned int)
prog.cc:30:8: note: built-in candidate operator==(long, unsigned long)
prog.cc:30:8: note: built-in candidate operator==(long, unsigned long long)
prog.cc:30:8: note: built-in candidate operator==(long, unsigned __int128)
prog.cc:30:8: note: built-in candidate operator==(long long, float)
prog.cc:30:8: note: built-in candidate operator==(long long, double)
prog.cc:30:8: note: built-in candidate operator==(long long, long double)
prog.cc:30:8: note: built-in candidate operator==(long long, __float128)
prog.cc:30:8: note: built-in candidate operator==(long long, long)
prog.cc:30:8: note: built-in candidate operator==(long long, long long)
prog.cc:30:8: note: built-in candidate operator==(long long, __int128)
prog.cc:30:8: note: built-in candidate operator==(long long, unsigned int)
prog.cc:30:8: note: built-in candidate operator==(long long, unsigned long)
prog.cc:30:8: note: built-in candidate operator==(long long, unsigned long long)
prog.cc:30:8: note: built-in candidate operator==(long long, unsigned __int128)
prog.cc:30:8: note: built-in candidate operator==(__int128, float)
prog.cc:30:8: note: built-in candidate operator==(__int128, double)
prog.cc:30:8: note: built-in candidate operator==(__int128, long double)
prog.cc:30:8: note: built-in candidate operator==(__int128, __float128)
prog.cc:30:8: note: built-in candidate operator==(__int128, long)
prog.cc:30:8: note: built-in candidate operator==(__int128, long long)
prog.cc:30:8: note: built-in candidate operator==(__int128, __int128)
prog.cc:30:8: note: built-in candidate operator==(__int128, unsigned int)
prog.cc:30:8: note: built-in candidate operator==(__int128, unsigned long)
prog.cc:30:8: note: built-in candidate operator==(__int128, unsigned long long)
prog.cc:30:8: note: built-in candidate operator==(__int128, unsigned __int128)
prog.cc:30:8: note: built-in candidate operator==(unsigned int, float)
prog.cc:30:8: note: built-in candidate operator==(unsigned int, double)
prog.cc:30:8: note: built-in candidate operator==(unsigned int, long double)
prog.cc:30:8: note: built-in candidate operator==(unsigned int, __float128)
prog.cc:30:8: note: built-in candidate operator==(unsigned int, long)
prog.cc:30:8: note: built-in candidate operator==(unsigned int, long long)
prog.cc:30:8: note: built-in candidate operator==(unsigned int, __int128)
prog.cc:30:8: note: built-in candidate operator==(unsigned int, unsigned int)
prog.cc:30:8: note: built-in candidate operator==(unsigned int, unsigned long)
prog.cc:30:8: note: built-in candidate operator==(unsigned int, unsigned long long)
prog.cc:30:8: note: built-in candidate operator==(unsigned int, unsigned __int128)
prog.cc:30:8: note: built-in candidate operator==(unsigned long, float)
prog.cc:30:8: note: built-in candidate operator==(unsigned long, double)
prog.cc:30:8: note: built-in candidate operator==(unsigned long, long double)
prog.cc:30:8: note: built-in candidate operator==(unsigned long, __float128)
prog.cc:30:8: note: built-in candidate operator==(unsigned long, long)
prog.cc:30:8: note: built-in candidate operator==(unsigned long, long long)
prog.cc:30:8: note: built-in candidate operator==(unsigned long, __int128)
prog.cc:30:8: note: built-in candidate operator==(unsigned long, unsigned int)
prog.cc:30:8: note: built-in candidate operator==(unsigned long, unsigned long)
prog.cc:30:8: note: built-in candidate operator==(unsigned long, unsigned long long)
prog.cc:30:8: note: built-in candidate operator==(unsigned long, unsigned __int128)
prog.cc:30:8: note: built-in candidate operator==(unsigned long long, float)
prog.cc:30:8: note: built-in candidate operator==(unsigned long long, double)
prog.cc:30:8: note: built-in candidate operator==(unsigned long long, long double)
prog.cc:30:8: note: built-in candidate operator==(unsigned long long, __float128)
prog.cc:30:8: note: built-in candidate operator==(unsigned long long, long)
prog.cc:30:8: note: built-in candidate operator==(unsigned long long, long long)
prog.cc:30:8: note: built-in candidate operator==(unsigned long long, __int128)
prog.cc:30:8: note: built-in candidate operator==(unsigned long long, unsigned int)
prog.cc:30:8: note: built-in candidate operator==(unsigned long long, unsigned long)
prog.cc:30:8: note: built-in candidate operator==(unsigned long long, unsigned long long)
prog.cc:30:8: note: built-in candidate operator==(unsigned long long, unsigned __int128)
prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, float)
prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, double)
prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, long double)
prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, __float128)
prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, long)
prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, long long)
prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, __int128)
prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, unsigned int)
prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, unsigned long)
prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, unsigned long long)
prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, unsigned __int128)
1 error generated.

-4

আর একটি সাধারণ ব্যবহার হ'ল স্ট্যান্ড পাত্রে কাস্টম অবজেক্টের মূল মানগুলির সাথে সমতা তুলনা করতে

class Foo
{
    public: int val;
};

class Comparer { public:
bool operator () (Foo& a, Foo&b) const {
return a.val == b.val; 
};

class Blah
{
std::set< Foo, Comparer > _mySet;
};

4
এটি উদাহরণ ব্যবহার করে operator ()না operator bool। এগুলি সম্পূর্ণ আলাদা। operator ()কল অপারেটর, যাতে Comparerএকটি ফাংশন হিসাবে ডাকা যেতে পারে। এটি operator ()কেবল ফিরে আসতেই ঘটে bool, তবে এটি এটির মতো হয় না operator bool, যা কেবল একটি অন্তর্নিহিত কাস্টের অনুমতি দেয় bool
মাইকেল ডারস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.