私がしようとしているのは、この単純なテンプレートクランプ機能です。 実行時とコンパイル時にupper >= lower
を確実にしたいです。リファレンステンプレートの引数型のstatic_assert
template <typename T>
T clamp(const T& lower, const T& upper, const T& n)
{
weak_assert(upper >= lower);
return std::max(lower, std::min(n, upper));
}
書くために合理的なようだ:
static_assert(upper >= lower, "invalid bounds");
非constexpr
の引数で呼び出されたときしかし、コンパイラは私にこれを与える:
Static_assert expression is not an integral constant expression
In instantiation of function template specialization 'clamp<int>' requested here
が適切にこれを達成するためにどのような方法があります? constexpr
で呼び出された場合(たとえば、clamp<int>(0, 10, myvar)
static_assertがそうでなければ通常のダイナミックアサートを行います、解雇すべきですか?
あなたは、静的な値のメンバーでヘルパー構造体を使って、constexprの評価を実施し、その中でstatic_assertを置くことができます。それはconstexprと非constexpr呼び出しの呼び出しシグネチャを変更します...私はオプションのstatic_assertを実行する方法は知られておらず、constexpr関数の評価がコンパイル時に実際に評価されるという事実はほとんど意味がありませんテンプレートパラメータを設定するために使用されない限り、指定されません。 – rubenvb
C++ 14以降では、constexpr関数にassert()を追加できます。 – kamikaze