Mam kilka krótkich funkcji constexpr
w moich bibliotekach, które wykonują proste obliczenia. Używam ich zarówno w czasie wykonywania, jak i podczas kompilacji.Alternatywa dla funkcji constexpr
chciałbym wykonać pewne twierdzenia w organizmie tych funkcji, jednak assert(...)
nie jest ważny w constexpr
funkcji i static_assert(...)
nie może być używana do sprawdzania parametrów funkcji.
Przykład:
constexpr int getClamped(int mValue, int mMin, int mMax) noexcept
{
assert(mMin <= mMax); // does not compile!
return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue);
}
Czy istnieje sposób wyboru czy funkcja jest wykonywany w czasie wykonywania lub w czasie kompilacji stała i wykonać assert
tylko jeśli jest wykonywane w czasie wykonywania ?
constexpr int getClamped(int mValue, int mMin, int mMax) noexcept
{
assert_if_runtime(mMin <= mMax);
return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue);
}
@dasblinkenlight: Chodzi o to, że 'static_assert' [nie ma sensu w tym przypadku] (http://ideone.com/6yjdAE). –
(Zastrzeżenie: jestem noobem i nigdy nie używałem constexpr w prawdziwym życiu.) Na podstawie mojej początkowej wyszukiwarki Google, chyba że Twój kompilator obsługuje [N3652] (http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2013/n3652.html), który rozluźnia "constexpr" w C++ 11, nie może zrobić tego, o co prosisz. Gdy to będzie możliwe, będziesz mógł rzucić wyjątek, taki jak 'std :: range_error' zamiast' static_assert'. Możesz spróbować swoich sił używając [Clang 3.4 ze std = C++ 14] (http://clang.llvm.org/cxx_status.html). – rwong
Twoje roszczenie nie jest prawdziwe w przypadku Clanga w trybie '-std = C++ 1y', assert będzie działało dobrze.powinieneś odwołać się do 'C++ 11', jeśli jesteś ograniczony do tego standardu. – TemplateRex