cuốn sách gpt4 ai đã làm

Điều kiện trong việc triển khai hàm mẫu phụ thuộc vào việc loại có phải là con trỏ hay không

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 08:15:21 39 4
mua khóa gpt4 Nike

Vì vậy, tôi có chức năng mẫu này. Nó phải ở trong một tập tin có tên Tóm tắtSự kiện Đặt một biến trong cấu trúc phức tạp hơn:

mẫu

void Tóm tắtEvent::setVar( QString varName, giá trị T)
{
nếu (std::is_pointer::value)
{
void * castValue = static_cast(value);
if(castValue)
{
// làm điều gì đó với castValue
}

}
khác
{
//làm điều gì đó có giá trị
}
}

Sử dụng hàm mẫu này, tôi muốn lưu trữ "giá trị" biến trong QVariant và sau đó lưu trữ QVariant ở đâu đó.

Nếu "giá trị" là một con trỏ, tôi muốn lưu trữ nó trong QVariant dưới dạng void*. Đối với bất cứ điều gì khác tôi muốn lưu trữ loại thực sự.

Tôi đang cố gắng sử dụng tính năng C++ std::is_pointer::value để kiểm tra xem giá trị có phải là con trỏ hay không.

Mã này biên dịch tốt, nhưng khi tôi cố gắng sử dụng nó như sau:

int intValue = 0;
setVar("aVar",intValue);

Tôi gặp lỗi này:

lỗi C2440: 'static_cast': không thể chuyển đổi từ 'int' thành 'void *'

Tôi nghĩ trình biên dịch bị nhầm lẫn vì nó đang kiểm tra dòng này:

    void * castValue = static_cast(value);

Tất nhiên, điều này không có ý nghĩa khi giá trị không phải là con trỏ. Đây là câu lệnh if của tôi

     nếu (std::is_pointer::value)

Tuy nhiên, nên tránh, ngay cả khi chạy, mã có giá trị int này không bao giờ được thực thi và tại thời điểm biên dịch, nó làm trình biên dịch nhầm lẫn... Có cách nào giải quyết loại vấn đề này không?

câu trả lời hay nhất

Phân phối nhãn:

mẫu
void Tóm tắtEvent::setVar_impl( QString varName, giá trị T, std::true_type /*is_ptr*/)
{
void * castValue = static_cast(value);
if(castValue)
{
// làm điều gì đó với castValue
}
}

mẫu
void Tóm tắtEvent::setVar_impl( QString varName, giá trị T, std::false_type /*is_ptr*/)
{
//làm điều gì đó có giá trị
}

mẫu
void Tóm tắtEvent::setVar( QString varName, giá trị T){
setVar_impl(varName, value, std::is_pointer());
}

Hoặc, tải lại rồi SFINAE để xóa những cái không áp dụng:

mẫu
tên kiểu chữ std::enable_if<>::value>::type
Tóm tắtEvent::setVar(QString varName, giá trị T)
{
void * castValue = static_cast(value);
if(castValue)
{
// làm điều gì đó với castValue
}
}

mẫu
tên kiểu chữ std::enable_if::value>::type
Tóm tắtEvent::setVar(QString varName, giá trị T)
{
//làm điều gì đó có giá trị
}

Tùy chọn thứ ba là tải lại trực tiếp:

mẫu
void Tóm tắtEvent::setVar( QString varName, giá trị T*)
{
void * castValue = static_cast(value);
if(castValue)
{
// làm điều gì đó với castValue
}
}

mẫu
void Tóm tắtEvent::setVar( QString varName, giá trị T)
{
//làm điều gì đó có giá trị
}

Mẫu đầu tiên chuyên nghiệp hơn mẫu thứ hai thông qua việc đặt hàng từng phần nên nếu cả hai đều khả thi như nhau thì sẽ được chọn.

Bạn cũng có thể muốn T == nullptr_t Tình huống này được xử lý đặc biệt. nullptr_t Không phải là loại con trỏ, nhưng bạn có thể muốn gọi tình trạng quá tải con trỏ trong trường hợp đó.

Về c++ - điều kiện trong việc triển khai hàm mẫu phụ thuộc vào việc loại đó có phải là con trỏ hay không, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/26466729/

39 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress