"Thành ngữ bool an toàn" là câu trả lời kỹ thuật cho câu hỏi "tôi muốn một chiếc xe vừa là xe thể thao vừa là máy kéo và có thể là thuyền". Câu trả lời thực tế không phải là câu trả lời kỹ thuật & hellip;
Điều đó nói rằng, vấn đề mà nó giải quyết chỉ là đưa ra kết quả có thể chuyển đổi thành bool
nhưng không được nhiều thứ khác (nếu không, một thể hiện của lớp có thể được chuyển thành đối số thực tế, ví dụ: đối số chính thức là int
, Nói). Một con trỏ dữ liệu có thể được chuyển đổi thành void*
. Một con trỏ hàm không phải là, ít nhất là chính thức trong tiêu chuẩn C++ (Posix là cái gì khác, thực hành cũng).
Sử dụng con trỏ hàm thành viên bảo vệ chống lại việc vô tình gọi hàm, được cung cấp con trỏ từ toán tử bool an toàn. Các const
hạn chế nó một chút, nhưng nếu số phận đã đặt một ai đó trên con đường làm cho số lượng tối đa của những sai lầm ngớ ngẩn, người đó vẫn có thể quản lý để gọi chức năng không làm gì cả. Thay vì const
Tôi nghĩ rằng tôi sẽ chỉ để cho nó có một đối số của một loại tư nhân, nơi mà mã khác không thể cung cấp một đối số như vậy, và sau đó nó không phải là một loại hàm thành viên ngớ ngẩn nữa.
có thể trông như thế này:
#include <stdio.h>
class Foo
{
private:
enum PrivateArg {};
typedef void (*SafeBool)(PrivateArg);
static void safeTrue(PrivateArg) {}
bool state_;
public:
Foo(bool state): state_(state) {}
operator SafeBool() const
{ return (state_? &safeTrue : 0); }
};
int main()
{
if(Foo(true)) { printf("true\n"); }
if(Foo(false)) { printf("false\n"); } // No output.
//int const x1 = Foo(false); // No compilado!
//void* const x2 = Foo(false); // No compilado!
}
Tất nhiên, câu trả lời thực tế thay vì là một cái gì đó như thế này:
#include <stdio.h>
class Foo
{
private:
bool isEmpty_;
public:
Foo(bool asInitiallyEmpty)
: isEmpty_(asInitiallyEmpty)
{}
bool isEmpty() const { return isEmpty_; }
};
int main()
{
if(Foo(true).isEmpty()) { printf("true\n"); }
if(Foo(false).isEmpty()) { printf("false\n"); } // No output.
//bool const x0 = Foo(false); // No compilado!
//int const x1 = Foo(false); // No compilado!
//void* const x2 = Foo(false); // No compilado!
}
Tóm tắt wrt. câu hỏi được yêu cầu:
- Cách bool_type (typedef) và this_type_does_not_support_comparisons là const?
Ai đó không hiểu những gì họ đã mã hóa. Hoặc có thể là họ có ý định hạn chế khả năng gọi điện một chút. Nhưng sau đó, biện pháp khá vô ích.
- Không ai thực sự phải gọi hàm thành viên thông qua con trỏ trả về, đúng không?
Phải.
- Có cần thiết ở đây không?
số
- Would hành bool_type (chức năng thành viên) vi phạm const-đúng đắn bằng cách khác?
số
Cheers & h.,
Nguồn
2011-08-11 15:36:13
đặt cược của tôi là 'const' là không cần thiết. Một cơ thể cho hàm này cũng không phải là vì bạn không phải gọi hàm đó. –
@ Alex: Nhưng chức năng thành viên không có thân thể không có địa chỉ, đúng không? Nó không biên dịch mà không có một cơ thể trên VC10, ít nhất. – fredoverflow
hmm bạn nói đúng. Tôi chỉ kiểm tra mẫu 'safe_bool' của mình mà tôi có trong dự án hiện tại của VS2010 và nó có phần thân. Nó cũng có 'const'. –