Vấn đề này đã được thảo luận một vài lần nhưng tất cả các giải pháp tôi đã tìm thấy hoặc không hoạt động hoặc được dựa trên khẳng định tĩnh của boost. Vấn đề của tôi rất đơn giản. Tôi có một lớp, và tôi chỉ muốn cho phép các loại thực (double và float). Tôi muốn một lỗi biên dịch thời gian nếu tôi cố gắng để nhanh chóng lớp với một loại khác hơn là nổi hoặc tăng gấp đôi. Tôi đang sử dụng Visual C++ 11. Dưới đây là những gì tôi đã thử:Làm cách nào để hạn chế một lớp mẫu đối với các loại được cài sẵn nhất định?
template <typename RealType>
class A
{
// Warning C4346
static_assert(std::is_same<RealType, double>::value || std::is_same<RealType, float>::value);
}
template <typename RealType>
class A
{
// Error C2062: type 'unknown' unexpected
static_assert(decltype(RealType) == double || decltype(RealType) == float);
}
Bất kỳ ý tưởng nào? Cảm ơn trước!
Câu hỏi thứ nhất là, nó quan trọng? Nếu bạn khởi tạo mẫu với một kiểu khác, và kiểu này không thể được xử lý theo cách khuôn mẫu mong đợi để xử lý nó, việc biên dịch sẽ thất bại. Và nếu nó có thể, cho phép * chỉ * hai loại đó có hiệu quả ngoài vòng pháp luật ... nói ... một kiểu như BigDecimal. – cHao
studio trực quan thực sự đưa ra cảnh báo khi static_assert không thành công và không phải là lỗi? Âm thanh như một con bọ. –
Cũng thấy [mẫu C++ chỉ chấp nhận một số loại nhất định] (http://stackoverflow.com/q/874298/) và [Giới hạn tham số mẫu C++ thành lớp con] (http://stackoverflow.com/q/3175219).Chúng có trước C++ 11, nhưng chúng có thể tạo điểm đánh dấu tốt cho người khác. – jww