Tôi chỉ nhận ra những câu hỏi khó có thể ... Hy vọng rằng tôi có thể đưa ra các ví dụ vừa đủ vừa đủ để chứng minh vấn đề của tôi và đủ ngắn để không làm mọi thứ rối loạn ... Ít nhất có khả năng chỉnh sửa.C++ Templating vs Inheritance
Vì vậy, đây là loại tình huống của tôi vào lúc này. Tất nhiên tôi thay đổi nó một chút về mặt logic/cấu trúc (và về mặt đặt tên anyway) cố gắng tập trung vào bản chất của câu hỏi của tôi:
// MyClass deals with lists (actually several data structures) of the
// type MyType which should support different types and has to be
// efficiently dealt with. Templating seems just right here
class MyClass
{
...
void doSomething<class MyType>(vector<MyType> someList);
...
// At some point I have to extract elements of the type MyType.
// The extractor obviously depends on MyType but it is not possible to
// Create a general version that could use templates itself
// (unless I use a specialization for each possible MyType)
// I am stuck between these two alternatives:
// Possibility1:
// Let the client pass the right extractor and template it.
template<class Extractor, class MyType>
void extract(const Extractor& extractor, const string& source,
vector<MyType>* dest)
{
extractor.extract(source, dest);
}
// Possibility2:
// Use a member _extractor of some base type that has to be set
// to a specialization. The ExtractorBase has a virtual method
// template<T> void extract(const string& source, vector<T>* myType) = 0
// with no definition that is only defined in subclasses wrt certain
// postings.
ExtractorBase _extractor;
template<class MyType>
void extract(const string& source, vector<MyType>* dest)
{
_extractor.extract(source, dest);
}
}
Tại thời điểm tôi muốn possibility1, bởi vì tôi don' t có để gây rối với thừa kế trong Extractor cho tất cả các biến thể của MyType và liên kết Extractor tôi muốn thử trong tương lai.
Mặt khác, các trình giải nén có thể yêu cầu mã phức tạp và một số thành viên (giống như bản đồ lớn ánh xạ các đầu vào nhất định trên các giá trị nhất định). Vì vậy, sẽ không có hiệu suất đạt được bằng cách sử dụng mẫu. Đặc biệt chỉ sử dụng các tệp tiêu đề mà các Trình giải nén và thậm chí có thể là các functors được cho là có được nội tuyến, là loại ra khỏi câu hỏi. Trong quá khứ, đây là một con trỏ mạnh mẽ với tôi rằng việc tạo khuôn mẫu sẽ chỉ làm tăng độ phức tạp của mã (phải đối phó với việc khởi tạo, làm cho cuộc sống khó khăn hơn đối với mã máy khách, v.v) và tôi nên cố gắng tránh nó hoàn toàn.
Hoặc có khả năng thứ ba mà tôi không nghĩ đến?
Bạn có ý nghĩa gì khi 'trích xuất'? Có phải chỉ có vector sẽ được sử dụng? –
vines
nó không rõ ràng như thế nào MyClass là tham gia vào quá trình khai thác (và tại sao giải nén() là một _method_ của MyClass?) – user396672