2013-08-13 34 views
5

Tôi có một số mã chung cần chạy xác nhận trên kết quả của hàm thành viên. Chức năng thành viên này có thể là constexpr hoặc có thể không.Một macro khẳng định mở rộng tới static_assert khi có thể?

template<typename T> 
void foo(T t) { 
    assert(t.member_function() == 10); 
} 

t.member_function()thể là một biểu thức hằng số, tôi tự hỏi nếu nó có thể được coi như một static_assert trong những trường hợp như vậy, nhưng nếu không mặc định bình thường assert. Điều này có thể không?

+1

Tương tự như http://stackoverflow.com/q/11441302/560648. Không chắc chắn đó là áp dụng mặc dù. –

+3

http://stackoverflow.com/q/6939103/560648 gần hơn và [câu trả lời là "không"] (http://stackoverflow.com/a/6941680/560648). –

+1

[stackoverflow.com/questions/18648069](http://stackoverflow.com/questions/18648069/g-doesnt-compile-constexpr-function-with-assert-in-it) thậm chí còn gần hơn và nói "có nhưng " –

Trả lời

1

Đây là giải pháp hơi điên rồ.

Bỏ ghi chú dòng Const c; foo(c); và bạn sẽ thấy rằng nó sẽ không biên dịch. Đây là xác nhận thời gian biên dịch.

Yêu cầu variable length arrays và có thể các công cụ biên dịch cụ thể khác. Tôi đang trên g ++ - 4.6.

Kích thước của mảng là 0 hoặc -1, tùy thuộc vào việc hàm thành viên trả về 10. Vì vậy, nếu điều này có thể được tính tại thời gian biên dịch, thì biên dịch nhận ra đó là mảng độ dài không biến và nó có kích thước âm. Kích thước âm cho phép nó phàn nàn. Nếu không, nó rơi qua một khẳng định thông thường.

Xin lưu ý: Tôi nhận được một số kết xuất lõi với phiên bản Thời gian chạy ngay sau khi xác nhận thời gian chạy không thành công. Có lẽ nó không thích cố gắng để free một mảng với kích thước tiêu cực. Cập nhật: Tôi nhận được bãi lõi với bất kỳ sự thất bại khẳng định, thậm chí int main() {assert (1==2);}. Điều này có bình thường không?

#include <iostream> 
#include <cassert> 
using namespace std; 

struct Const { 
     constexpr int member_function() { return 9; } 
}; 
struct Runtime { 
        int member_function() { return 9; } 
}; 

template<typename T> 
void foo(T t) { 
     if(0) { // so it doesn't actually run any code to malloc/free the vla 
      int z[(t.member_function()==10)-1]; // fails at compile-time if necessary 
     } 
     assert(t.member_function()==10); 
} 


int main() { 
     //Const c; foo(c); 
     Runtime r; foo(r); 
} 
Các vấn đề liên quan