Có, bạn có thể. Nhưng bạn sẽ cần phải thay đổi cấu trúc cuộc gọi, nhưng chỉ một chút.
Cụ thể, sử dụng mẫu chiến lược để cơ cấu lại việc triển khai chức năng thành viên như một lớp (IS được phép chuyên môn hóa).
Điều này được cho phép miễn là lớp chiến lược không được lồng nhau (và do đó không phụ thuộc vào loại mẫu không chuyên biệt).
ví dụ: (Điều này có lẽ là không đúng cú pháp, nhưng ý tưởng phải rõ ràng)
template <class T>
class OuterThingThatIsNotSpecialized
{
template <class U>
void memberWeWantToSpecialize(const U& someObj_)
{
SpecializedStrategy<U>::doStuff(someObj_);
}
};
template <class U>
struct SpecializedStrategy;
template <>
SpecializedStrategy<int>
{
void doStuff(const int&)
{
// int impl
}
};
template <>
SpecializedStrategy<SomeOtherType>
{
void doStuff(const SomeOtherType&)
{
// SOT impl
}
};
Đây là cực kỳ hữu ích vì các cuộc gọi đến OuterThingThatIsNotSpecialized với nhiều loại mà không thực hiện tồn tại chỉ đơn giản là sẽ không biên dịch.
PS. Bạn thậm chí có thể sử dụng chiến lược này để một phần chuyên chức năng mẫu, cái gì đó là một C++ khác không thể.
Nguồn
2009-02-21 18:35:49
Thất vọng. Cảm ơn bạn đã tham khảo! –
ISO14882: 1998 Phần 14.7.3, đoạn 16 là phần mô tả tình huống này. – greyfade