2013-04-24 21 views
6

tôi đã viết một hàm:[Xác nhận thời gian biên dịch C++]: Chúng tôi có thể ném lỗi biên dịch nếu một số điều kiện không được đáp ứng không?

template<int N> void tryHarder() { 
    for(int i = 0; i < N; i++) { 
     tryOnce(); 
    } 
} 

nhưng tôi chỉ muốn nó biên dịch nếu N là ở giữa 0 và 10. Tôi có thể làm điều đó? Làm sao?

+6

Hãy xem [static_assert] (http://en.cppreference.com/w/cpp/language/static_assert) – juanchopanza

+0

@juanchopanza: Đó là câu trả lời. – Nawaz

+0

Có vẻ tuyệt vời! Nhưng có bất cứ điều gì trước C++ 11? – MciprianM

Trả lời

13

Bạn có thể làm điều đó với static_assert declaration:

template<int N> void tryHarder() { 

    static_assert(N >= 0 && N <= 10, "N out of bounds!"); 

    for(int i = 0; i < N; i++) { 
     tryOnce(); 
    } 
} 

Tính năng này chỉ sẵn từ C++ 11. Nếu bạn đang mắc kẹt với C++ 03, hãy xem Boost's static assert macro.

Toàn bộ ý tưởng về đây là thông báo lỗi đẹp. Nếu bạn không quan tâm đối với những người, hoặc có thể thậm chí không affor tăng, bạn có thể làm một cái gì đó như sau:

template<bool B> 
struct assert_impl { 
    static const int value = 1; 
}; 

template<> 
struct assert_impl<false> { 
    static const int value = -1; 
}; 

template<bool B> 
struct assert { 
    // this will attempt to declare an array of negative 
    // size if template parameter evaluates to false 
    static char arr[assert_impl<B>::value]; 
}; 

template<int N> 
void tryHarder() 
{ 
    assert< N <= 10 >(); 
} 

int main() 
{ 
    tryHarder<5>(); // fine 
    tryHarder<15>(); // error, size of array is negative 
} 
+0

Điều này giả định rằng 'N' là một hằng số thời gian biên dịch, tho '. –

+1

Thực hiện đơn giản hơn một chút nếu bạn thay đổi nó thành 'template void tryHader() {static_assert (N <= 10," N ngoài giới hạn! ");' – Yakk

+4

@MatsPetersson như một đối số mẫu, có vẻ như một giả định an toàn, nó là một hằng số thời gian biên dịch. – Yakk

-2
#if !defined(__cplusplus) 
#error C++ compiler required. 
#endif 

Đây chỉ là một ví dụ.

Dưới đây là liên kết nguồn: http://msdn.microsoft.com/en-us/library/c8tk0xsk(v=vs.71).aspx

Tất cả tôi nói là bạn có thể sử dụng #error cũng

Nó là một chỉ thị

Sửa @Pratik Chowdhruy: Tôi đồng ý với Paul R. Điều này không trả lời trực tiếp câu hỏi. Xin lỗi cho cộng đồng

+0

Điều này không trả lời được câu hỏi. –

+0

Nhìn vào các câu trả lời khác để hiểu vấn đề ở đây là gì - OP muốn biết cách thực hiện một xác nhận biên dịch trên tham số mẫu, không phải cách sử dụng trình biên dịch có điều kiện và '# error'. –

+0

Tôi xin lỗi Paul R –

1

Đối với pre C++ 11 trình biên dịch, bạn có thể thực hiện một chế mẫu tham số trên các tham số không kiểu N.

Đối với một mô tả về cách để làm điều này, vui lòng xem http://stroustrup.com/bs_faq2.html#constraints