2016-10-27 16 views
42

Hãy nói rằng tôi có một mảng các số nguyên được xác định như thế:Nhận min/giá trị tối đa của một mảng constexpr tĩnh tại thời gian biên dịch

static constexpr int IntArray[] = {1, 5, 10, 12, 17}; 

Có cách nào để có được tối thiểu hoặc giá trị lớn nhất tại thời gian biên dịch?

+6

Nó có thể là có thể làm điều đó với đệ quy [ 'constexpr'] (http://en.cppreference.com/w/cpp/language/constexpr) chức năng. –

+0

Trong C++, có thể sử dụng mẫu meta-programming để giải quyết nó. – vsz

Trả lời

61

Hãy giải pháp C++ 17 ra khỏi con đường cho tìm kiếm tàu ​​do thám tương lai:

constexpr int IntArray[] = {1, 5, 10, 12, 17}; 
constexpr int min = *std::min_element(std::begin(IntArray), std::end(IntArray)); 
static_assert(min == 1); 

C++ 11 là kén chọn hơn với constexpr chức năng, vì vậy chúng tôi phải tung ra một thuật toán đệ quy. Điều này là một đơn giản, thẳng một:

template <class T> 
constexpr T &constexpr_min(T &a, T &b) { 
    return a > b ? b : a; 
} 

template <class T> 
constexpr T &arrayMin_impl(T *begin, T *end) { 
    return begin + 1 == end 
     ? *begin 
     : constexpr_min(*begin, arrayMin_impl(begin + 1, end)); 
} 

template <class T, std::size_t N> 
constexpr T &arrayMin(T(&arr)[N]) { 
    return arrayMin_impl(arr, arr + N); 
} 

constexpr int IntArray[] = {1, 5, 10, 12, 17}; 
constexpr int min = arrayMin(IntArray); 

See it live on Coliru

+0

Ở đây tôi đang cố gắng để thực hiện một phiên bản C++ 17 và tôi đã có một. :(Nhưng tốt để biết.;) – Hayt

+0

Câu trả lời hay! Bạn có thể đưa ra nhận xét ngắn gọn về lý do bạn sử dụng tham chiếu làm loại trả lại không? Nó sẽ không hoạt động theo cách khác do khấu trừ loại xung đột (CV bị loại bỏ khỏi không phải là refs). – vsoftco

+0

@ vsoftco không có lý do cụ thể, nó chỉ linh hoạt hơn. Tôi không gặp bất kỳ lỗi nào khi xóa chúng, bạn có thể hiển thị một ví dụ không? – Quentin

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