2015-02-23 12 views
14

Có cách nào để đạt được hành vi khác nhau của một hàm constexpr trong giai đoạn biên dịch và khi chạy không?Xác định thực thi `constexpr` - trong quá trình biên dịch hoặc khi chạy?

xem xét ví dụ sau (sử dụng một tính năng lý thuyết từ D: static if):

constexpr int pow(int base , int exp) noexcept 
{ 
    static if(std::evaluated_during_translation()) { 
     auto result = 1; 
     for(int i = 0 ; i < exp ; i++) 
      result *= base; 
     return result; 
    } else { // std::evaluated_during_runtime() 
     return std::pow(base , exp); 
    } 
} 

Nếu không, có cách nào để hạn chế constexpr được thời gian biên dịch chỉ?

+2

Nếu bạn sử dụng nó trong một [conext nơi biểu thức liên tục được yêu cầu thì nó sẽ được đánh giá tại thời gian biên dịch] (http://stackoverflow.com/a/25891133/1708801) –

+0

Bạn có thể có may mắn với GCC-nội tại '__builtin_constant_p' ... – Deduplicator

+0

@Docuplicator không phải là một tính năng được viết tài liệu rất tốt, ít nhất là lần cuối tôi nhìn nhưng tôi đặt mọi thứ tôi có thể tìm thấy trên đó trong [answer] (http://stackoverflow.com/a/24400015/ 1708801). –

Trả lời

6

Không, không có cách nào như vậy.

Rất tiếc.

N3583 is a paper đề xuất thay đổi để cho phép những gì bạn đang yêu cầu.

+0

Chỉ cần nhìn thấy điều này [Scott Meyers nói] (https://www.youtube.com/watch?v=WDIkqP4JbkE), nơi ông cũng nói rằng người ta phải sử dụng hai chức năng khác nhau. – nonsensation

+0

Bài viết này là một câu trả lời hay, không may là chúng tôi phải chờ một vài năm cho đến khi (nếu bao giờ) nó được thực hiện. Một đặc tính kiểu sẽ dễ thực hiện đối với các trình biên dịch và sẽ có tác động tối thiểu đến tiêu chuẩn. – nonsensation

+0

Bạn có biết trạng thái của đề xuất này không? – nonsensation

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