Tôi có một số hàm constexpr
ngắn gọn trong các thư viện của tôi thực hiện một số phép tính đơn giản. Tôi sử dụng cả hai trong bối cảnh thời gian chạy và biên dịch.Cách khác để xác nhận các hàm constexpr
Tôi muốn thực hiện một số xác nhận trong phần thân của các chức năng này, tuy nhiên assert(...)
không hợp lệ trong chức năng constexpr
và không thể sử dụng static_assert(...)
để kiểm tra tham số chức năng.
Ví dụ:
constexpr int getClamped(int mValue, int mMin, int mMax) noexcept
{
assert(mMin <= mMax); // does not compile!
return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue);
}
Có cách nào để séc xem chức năng đang được thực hiện trong một thời gian chạy hoặc thời gian biên dịch liên tục và thực hiện assert
chỉ khi nó đang được thực hiện tại thời gian chạy ?
constexpr int getClamped(int mValue, int mMin, int mMax) noexcept
{
assert_if_runtime(mMin <= mMax);
return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue);
}
@dasblinkenlight: Ý của tôi là 'static_assert' [không có ý nghĩa trong dịp này] (http://ideone.com/6yjdAE). –
(Disclaimer: Tôi là một noob và không bao giờ sử dụng một constexpr trong cuộc sống thực.) Dựa trên tìm kiếm Google ban đầu của tôi, trừ khi trình biên dịch của bạn hỗ trợ [N3652] (http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2013/n3652.html) thư giãn C++ 11 'constexpr', nó không thể làm những gì bạn yêu cầu. Khi điều này có sẵn, bạn sẽ có thể ném một ngoại lệ như 'std :: range_error' thay cho' static_assert'. Bạn có thể thử sử dụng [Clang 3.4 with std = C++ 14] (http://clang.llvm.org/cxx_status.html). – rwong
yêu cầu của bạn không đúng đối với Clang ở chế độ '-std = C++ 1y', khẳng định sẽ hoạt động tốt.bạn nên gắn thẻ lại thành 'C++ 11' nếu bạn bị giới hạn ở tiêu chuẩn đó. – TemplateRex