2017-12-15 112 views
5

Tôi muốn viết các mẫu để xây dựng giả sử một cổng đầu vào. Điều đó có thể được thực hiện từ một cổng đầu vào-đầu ra đơn lẻ hoặc từ danh sách các chân đầu vào. Tôi thích những mẫu đó có cùng tên. Tôi có các khái niệm cho cả cổng đầu vào-đầu ra và các chân đầu vào. Tôi có thể viếtMẫu C++ có thể khớp với (chỉ) danh sách một loại hoặc một loại khác không?

template< typename... arguments > 
struct port_in .... 

template< pin_in T > 
struct port_in<> .... 

Nhưng bây giờ phiên bản danh sách sẽ chấp nhận bất kỳ loại nào. Tôi có thể kiểm tra rằng trong quá trình thực hiện, nhưng điều đó sẽ làm suy giảm thông báo lỗi mà người dùng nhận được khi anh ấy chuyển các loại không phù hợp. Tôi có thể bằng cách nào đó hạn chế danh sách cho một loại, nhưng cho phép một tham số mẫu đơn của loại khác không?

Trả lời

4

Nếu bạn muốn đảm bảo rằng người dùng luôn có được một thông báo lỗi hợp lý, sau đó bạn cần phải hạn chế các mẫu cơ bản. Giả sử các khái niệm hiện tại của bạn được đặt tên InputPinInputOutputPort, bạn có thể hạn chế các mẫu căn cứ để chấp nhận hoặc là một chuỗi các chân đầu vào hay đầu vào/đầu ra cổng đơn như sau:

template<class... Ts> 
concept bool AllInputPins = (InputPin<Ts> && ...); 

template<class... Ts> 
concept bool OneInputOutputPort = sizeof...(Ts) == 1 && (InputOutputPort<Ts> && ...); 

template <class... Args> 
    requires AllInputPins<Args...> || OneInputOutputPort<Args...> 
struct port_in { 
    // ... 
}; 
+0

Điều này có vẻ tốt. Tôi sẽ thử nó vào ngày mai. Những gì tôi đã mất là khả năng cho một khái niệm để chấp nhận một danh sách. –

+0

'khái niệm' không chuẩn. – SergeyA

+0

Có, nhưng tôi đang sử dụng các khái niệm (câu hỏi được gắn thẻ với 'khái niệm C++', và tôi đề cập đến các khái niệm trong văn bản câu hỏi. –

1

Nếu phiên bản danh sách được cho là mất số điện thoại bạn có thể làm cho nó:

template<uint16_t ... Ports> 
struct port_in .... 

Tôi không chắc chắn có một cách sạch để làm điều này nếu nó có thể mất không số nguyên và bạn muốn có một thực tế loại danh sách (đó không phải là tất cả các đối số cần phải cùng loại). Nếu bạn có thể yêu cầu tất cả các loại giống tôi nghĩ bạn có thể làm điều gì đó như:

template<typename T, std::enable_if_t<T> * = nullptr> 
struct port_in_base{}; 
template<typename T, T ... ports> 
struct port_in : port_in_base<T> .... 
+0

'Tôi không chắc chắn có một sạch cách để thực hiện điều này nếu nó có thể lấy các số nguyên và bạn muốn một kiểu tiêu chuẩn loại thực tế' bằng cách truyền 'std :: integral_constant' hoặc tương đương ... –

+0

Các tham số mẫu là tất cả các lớp, không phải là số nguyên. –

Các vấn đề liên quan