コンパイル時に既知のインデックスと実行時に静的にアサートする方法はありますか?例:インデックス上のstatic_assertはコンパイル時に知ります
template <class T, int Dim>
class Foo
{
T _data[Dim];
public:
const T &operator[](int idx) const
{
static_assert(idx < Dim, "out of range"); // error C2131: expression did not evaluate to a constant
return _data[idx];
}
};
int main()
{
Foo<float, 2> foo;
foo[0];
foo[1];
foo[2]; // compiler error
for (int i=0; i<5; ++i)
{
foo[i]; // run time assert when i > 1
}
return 0;
}
ありがとうございました。 – sharvey
GCCについては__builtin_constant_pを見ることができますが、あなたが提案していることをしようとすると、GCCで本当に奇妙な振る舞いがあるので、完璧な解決策は得られません。 –
あなたの 'foo [2]'アクセスは 'constexpr'コンテキストでは実行されず、あなたの演算子も' constexpr'ではありません。コンパイル時エラーは発生しません。あなたの目標を達成するには、 'assert'を使います(' static_assert'ではなく 'non-'constexpr'呼び出しエラーを返します)。 –