Có cách nào để xác định loại biến được chuyển đến mẫu và gọi hàm dựa trên nếu đó là int
hoặc std::string
v.v ...?Thực hiện các phương pháp khác nhau dựa trên loại biến mẫu
Ví dụ
template <class T>
struct Jam
{
Jam(T *var)
{
if (typeid(var) == typeid(std::string*)
*var = "Hello!";
else if (typeid(var) == typeid(int*)
*var = 25;
}
};
Khi tôi cố gắng sử dụng mã đó, tôi nhận được một lỗi invalid conversion from const char* to int
. Tôi nghi ngờ điều này là do trình biên dịch "mở rộng" mẫu thành các hàm riêng biệt và khi tôi chỉ định một cá thể mới của cấu trúc throw Jam<std::string>(&setme);
, nó phát hiện ra câu lệnh var* = 25
và từ chối biên dịch.
Có cách nào phù hợp để thực hiện việc này không? Có lẽ với bảo vệ macro? Cảm ơn.
Có các lựa chọn thay thế khác, ví dụ chỉ chuyên về hàm tạo ('template <> Jam :: Jam (int * var) {}' bên ngoài định nghĩa lớp mẫu) hoặc SFINAE phức tạp hơn để bật/tắt mã dựa trên trên các đối số mẫu ... Tôi không nghĩ nó có ý nghĩa trong vấn đề đơn giản này, nhưng nó có thể có ý nghĩa khi các giải pháp đơn giản này trở thành gánh nặng (nói rằng hàm tạo đã làm 100 thứ, chỉ một trong số đó phụ thuộc vào kiểu , hoặc có 100 chức năng thành viên khác và chuyên loại toàn bộ sẽ là tốn kém) –