tôi đã biết rằng bạn có thể bật (hoặc không) phương pháp của một lớp sử dụng std::enable_if
cho phép thành viên lớp của tùy thuộc vào mẫu
cho dụ:
template<size_t D, size_t E>
class Field
{
...
size_t offset(const std::array<float,D>& p) const
{
...
}
template<typename TT = size_t>
typename std::enable_if<D!=E, TT>::type
offset(const std::array<float,E>& p) const
{
return offset(_projection(p));
}
...
};
này giúp việc không thể gọi là chức năng không hợp lệ trong một trường hợp cụ thể cũng như loại bỏ các lỗi quá tải ... mà, đối với tôi, là rất tốt đẹp!
Tôi muốn tiếp tục và làm cho một số thành viên của lớp học chỉ có mặt khi cần thiết. Bằng cách đó tôi sẽ nhận được một lỗi nếu tôi cố gắng sử dụng một phản đối mà sẽ có cách khác không được khởi xướng
tôi đã cố gắng để làm
template<size_t D, size_t E>
class Field
{
...
template<typename TT = projectionFunc>
typename std::enable_if<D!=E, TT>::type _projection;
}
Nhưng trình biên dịch nói với tôi:
erreur: data member ‘_projection’ cannot be a member template
Is có cách nào để đạt được những gì tôi muốn?
Bạn có thể muốn thay đổi tên từ 'offsetof' vì ai đó bao gồm trước tiêu đề của bạn và nhận macro liên quan. –
chris
Đó là kế hoạch, tôi chỉ đang tìm kiếm một cái tên tốt đẹp – Amxx
Đó SFINAE cụ thể cũng là một chút ... icky. Trong trường hợp 'D == E' bạn kết thúc bằng' typename std :: enable_if :: type'. Một đặc điểm kiểu thư viện chuẩn là UB, do đó, có thể cho rằng việc thực hiện giả thuyết có thể gọi quy tắc "không có khả năng hợp lệ hóa có thể được tạo ra" và gọi điều này là không đúng định dạng. –