Giữ câu hỏi cũ. Xem dưới đây để giải quyết. Nó có lẽ là một cái gì đó đơn giản, nhưng vẫn còn. Tôi có sau C++ 11 đoạn mã:C++ 11 Các mẫu tham số mẫu có biến thể
#include <vector>
template <typename... Ts>
struct typelist
{
};
template <typename T>
struct EventContainer
{
typedef T Type;
/// TODO. Ring buffer
std::vector<T> container;
void push(const T& t)
{
EventContainer<T>::container.push_back(t);
}
virtual ~EventContainer()
{
}
};
template <template <typename...> class TL>
class EventStorage:
public EventContainer<Ts>...
{
};
class Event1
{
};
class Event2
{
};
typedef typelist<Event1,Event2> Events12;
int main()
{
EventStorage<Events12> ev;
return 0;
}
Làm thế nào tôi có thể làm cho EventStorage
kế thừa EventContainer
templeted với mỗi loại trong typelist
. Tôi có thể làm điều đó với Loki :: library, nhưng tôi muốn sử dụng C++ 11 với các mẫu variadic. Cảm ơn bạn.
Độ phân giải 1: Sửa lỗi EventStorage
vấn đề mẫu mẫu. Điều này sẽ làm cho EventStorage
, nhiều kế thừa tất cả EventContainer
được tô điểm với mỗi loại Ts
.
template <typename...>
class EventStorage
{
};
template <typename... Ts>
class EventStorage < typelist<Ts...> >:
public EventContainer<Ts>...
{
};
Bây giờ tôi phải biên dịch lỗi thời gian, trên main()
sau:
int main()
{
EventStorage<Events12> ev;
Event1 ev1;
ev.push(ev1);
return 0;
}
In function ‘int main()’:
error: request for member ‘push’ is ambiguous
error: candidates are: void EventContainer<T>::push(const T&) [with T = Event2]
error: void EventContainer<T>::push(const T&) [with T = Event1]
Tại sao trình biên dịch được nhầm lẫn? Sau khi tất cả tôi đẩy với loại cụ thể. GCC 4.6.1 tại đây.
Resolution2: Như @Matthieu M. đề nghị tôi có thể trình bày một phương pháp chuyển tiếp int EventStorage
, nhưng với chi phí của một cuộc gọi functin thêm:
template <typename T>
void push(const T& t)
{
EventContainer<T>::push(t);
}
Theo Alexandrescu, trình biên dịch sẽ tối ưu hóa cuộc gọi chuyển tiếp này miễn là tham số là tham chiếu. Bây giờ câu hỏi đã chính thức bị đóng :)
Tôi ước mình có thể tạo hạt các loại hoán vị 'Sự kiện' khác nhau. Ví dụ. 'typedef typelist pumpEvents;' 'typedef typelist displayEvents;' Nhưng khi bạn đặt nó theo cách đó, tôi muốn kết hợp hai 'typelists', nếu nhu cầu lưu trữ để lưu trữ cả hai. –
Tôi đã chỉnh sửa câu trả lời của mình để bao gồm bộ điều hợp 'typelist' và bộ kết hợp bộ nhớ. –
Cảm ơn bạn rất nhiều. Tôi sẽ cố gắng, sau khi tôi giải quyết vấn đề mơ hồ này từ những người khác của tôi trả lời bình luận. Nó là rất lạ. Không phải là 'đẩy()' gots quá tải? –