Tôi có một loại như thế này:có điều kiện định nghĩa kiểu bí danh
template<typename T>
struct wrapper
{
using foo = typename T::foo;
using bar = typename T::bar;
using baz = typename T::baz;
// More of those...
};
Tôi muốn foo
, bar
, baz
và tương đương loại bí danh được xác định khi và chỉ khi các loại tương đương tồn tại trong T
. Các giải pháp sử dụng std::conditional
cho phép thay thế bằng một thứ khác khi nó không tồn tại, nhưng tôi không biết làm thế nào để đảm bảo rằng nó không tồn tại chút nào khi kiểu tương ứng không tồn tại trong kiểu mẫu. Đoạn mã trên gây ra lỗi khi wrapper<T>
được khởi tạo nếu T
không xác định một trong các bí danh loại.
Tôi không thể thực hiện wrapper
được kế thừa từ T
vì wrapper
không được phép làm mọi thứ T
có thể thực hiện. Ngoài ra, bằng cách sử dụng một phần chuyên môn hóa sẽ dẫn đến một số loại vụ nổ mũ và sẽ nhanh chóng trở thành không thể duy trì. Tôi có thể tạo foo
, bar
... bí danh loại mẫu để chèn một thông số mẫu mặc định nhưng sau đó người dùng sẽ phải viết wrapper<T>::foo<>
, wrapper<T>::bar<>
thay vì wrapper<T>::foo
, wrapper<T>::bar
, v.v ... và tôi không muốn điều đó.
Có cách nào đơn giản nhưng dễ bảo trì để xác định bí danh loại như vậy chỉ khi bí danh loại tương ứng tồn tại trong T
?
Đó là giải pháp mà tôi có trong đầu và tôi đã sẵn sàng dùng thử. Nó không thực sự đẹp, nhưng vẫn duy trì được nhiều hơn các giải pháp khác mà không để lộ những thứ vô dụng cho người dùng. Cảm ơn :) – Morwenn
Dang. Tôi đã hy vọng rằng sẽ có một giải pháp đẹp hơn thế này. – Justin