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

C++ Microsoft: Cách liên kết uuid/guid với chuyên môn mẫu

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

Tôi muốn liên kết uuid/guide với chuyên môn về mẫu.

Đoạn mã sau có thể được sử dụng để liên kết uuid với giao diện không phải mẫu (lớp, cấu trúc):

__giao diện __declspec(uuid("CECA446F-2BE6-4AAC-A117-E395F27DF1F8")) ITest {
kiểm tra khoảng trống ảo() = 0;
};

Hướng dẫn GUID = __uuidof(ITest); // OK

Bây giờ tôi có một giao diện theo mẫu

mẫu __giao diện ITemplateTest {
Kiểm tra khoảng trống ảo(T t) = 0;
};

Tôi muốn làm như sau:

Mẫu GUIDGuid = __uuidof(ITemplateTest);

Không thể thêm __declspec(uuid(...)) vào định nghĩa lớp mẫu. Điều này là hiển nhiên vì các chuyên môn khác nhau của một giao diện yêu cầu các uuid khác nhau. Vì vậy, tôi đã cố gắng liên kết uuid với chuyên môn mẫu thông qua:

mẫu<> __giao diện __declspec(uuid("CF4AB938-8CE0-4AB7-A56C-0253B6018C26")) ITemplateTest;

Thật không may, điều này cũng không hoạt động (__uuidof(.) không thành công với "Không có GUID nào được liên kết với đối tượng này").

Có giải pháp nào cho vấn đề của tôi không?

Đây là một ví dụ đầy đủ hơn được thêm vào sau một số câu trả lời:

Giả sử tôi có một thuật toán phức tạp hoạt động trên các loại dữ liệu khác nhau. Để đơn giản, thuật toán "phức tạp" này bình phương một số. Tôi chỉ muốn triển khai thuật toán của mình một lần nên mẫu là lựa chọn phù hợp. Giả sử thêm rằng tôi muốn sử dụng giao diện vì ứng dụng của tôi sử dụng COM.

Vì vậy, đây là một giao diện và một đối tượng được tạo khuôn mẫu thực hiện giao diện này:

mẫu __giao diện ITemplateTest {
ảo T bình phương(T t) = 0;
};

template class CTemplateImplementation : public ITemplateTest {
public:
Hình vuông T ảo(T t) { return t * t };
};

Điều này cho phép làm một cái gì đó như

CTemplateImplementation xDouble;
CTemplateImplementation xFloat;
CTemplateImplementation xInt;

std::cout << xDouble.Square(5.) << std::endl
<< xFloat.Square(5.0f) << std::endl
<< xInt.Square(5) << std::endl;

Bây giờ, hãy giả sử thêm rằng tôi có một đối tượng mẫu khác cũng triển khai một thuật toán rất "phức tạp", sử dụng CTemplateImplementation:

mẫu lớp CSquareAndAddOne {
private:
CTemplateImplementation m_squarer;
public:
T SquareAndAddOne(T t) { return m_squarer.Square(t) + T(1 }
};

Đối tượng này bây giờ có thể được sử dụng theo cách tương tự:

CSquareAndAddOne yDouble;
CSquareAndAddOne yFloat;
CSquareAndAddOne yInt;

std::cout << yDouble.SquareAndAddOne(5.) << std::endl
<< yFloat.SquareAndAddOne(5.0f) << std::endl
<< yInt.SquareAndAddOne(5) << std::endl;

Sự cố phát sinh khi CSquareAndAddOne::SquandAddOne muốn sử dụng chuyên môn CTemplateImplementation của __uuid. Hãy thử như sau:

    T SquareAndAddOne(T t) {
Hướng dẫn GUID = __uuidof(m_multiplier);
trả về m_squarer.Square(t) + T(1);
}

Điều này không còn hoạt động vì không có GUID liên kết với m_multiplier. Vậy làm cách nào để bạn chỉ định các hướng dẫn cho các triển khai khác nhau của CTemplateImplementation (ba trong trường hợp này) mà không trùng lặp mã? Bạn có thể cung cấp một giải pháp hoàn chỉnh? Không thể lấy các lớp khác nhau cho các loại khác nhau từ CTemplateImplementation vì việc sử dụng cách gõ chính xác trong CSquareAndAddOne không còn có thể được kiểm soát bằng các tham số mẫu.

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

Tôi đã thử một số phép thuật khởi tạo rõ ràng và nó hoạt động tốt (ít nhất là trong VS2008 SP1):

template __interface ITemplateTest { void Test(T t };

mẫu __interface ITemplateTest; // Khởi tạo rõ ràng

mẫu __interface __declspec(uuid("CF4AB938-8CE0-4AB7-A56C-0253B6018C26") ITemplateTest; // Lặp lại việc khởi tạo rõ ràng với liên kết uuid

GUID guid = __uuidof(ITemplateTest); // Hãy tận hưởng :-)

Có vẻ như vấn đề ban đầu là __declspec Đang cố gắng chuyên môn hóa một lớp học Hướng dẫn được gán cho nó trước khi khởi tạo thực tế.

Về C++ Microsoft: Cách liên kết uuid/guid với chuyên môn mẫu, 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/11966892/

29 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