例如:
operator bool() const
{
return col != 0;
}
col
是一个int。
operator bool() const
如何运作?
答案 0 :(得分:117)
表单的成员函数
operator TypeName()
是转化运算符。它们允许使用类类型的对象,就好像它们属于TypeName
类型一样,当它们存在时,它们将使用转换函数转换为TypeName
。
在这种特殊情况下,operator bool()
允许使用类类型的对象,就好像它是bool
一样。例如,如果您有一个名为obj
的类类型的对象,则可以将其用作
if (obj)
这将调用operator bool()
,返回结果,并将结果用作if
的条件。
应该注意operator bool()
是一个非常坏的想法,你真的不应该使用它。有关问题原因以及解决问题的详细说明,请参阅"The Safe Bool Idiom."
(C ++ 0x,即将推出的C ++标准版本,增加了对显式转换运算符的支持。这些将允许您编写一个正常工作的安全explicit operator bool()
,而无需跳过实现安全布尔成语。)
答案 1 :(得分:8)
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;
}
答案 2 :(得分:6)
我想提供更多代码以明确说明。
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 :(得分:3)
这是用户定义的implicit
转换功能,可将您的班级转换为true
或false
。
//usage
bool value = yourclassinstance; //yourclassinstance is converted into bool!
答案 4 :(得分:1)
这是对bool
的隐式转换。即只要允许隐式转换,您的类就可以通过调用该方法转换为bool
。
答案 5 :(得分:1)
正如其他人所说,这是类型转换,在这种情况下是bool
。例如:
class A {
bool isItSafe;
public:
operator bool() const
{
return isItSafe;
}
...
};
现在我可以使用这个类的对象,就好像它是一个布尔值:
A a;
...
if (a) {
....
}
答案 6 :(得分:0)
在编写自己的unique_ptr时,我发现了这种情况。给定std::unique_ptr
's operator==
:
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 == 0
将转换为bool
,然后bool
将转换为{{1} },因为int
是内置的,而bool operator==(int, int)
是0
。等待我们的是模棱两可的重载解析错误。
这里是Minimal, Complete, and Verifiable example:
int
gcc:
#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
| ^~~~~~~~
答案 7 :(得分:-4)
另一个常见用途是std容器对自定义对象内的键值进行相等性比较
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;
};