Проверка значения аргумента constexpr функции

129
22 сентября 2019, 15:40

Есть класс и перегрузка оператора []

template <class T, size_t N>
class Vect
{
public:
typedef unsigned int size_type;
T coord[N] = {};
constexpr T& operator [] (size_type index)
    {
            return coord[index];
    }
}

Возможно каким то образом в compile-time проверить значение аргумента index? (index >= 0 && index < N)

Answer 1

Чтобы иметь возможность проверять какое-то значение во время компиляции, это значение должно использоваться в подходящем для этого контексте. Аргумент функции к такому контексту не относится. А вот если реализовать шаблонную функцию с non-type параметром, то это уже удастся сделать. Правда синтаксис уже будет иной:

#include <cstdlib>
template <class T, size_t N>
class Vect
{
public:
typedef unsigned int size_type;
T coord[N] = {};
template <size_type I>
constexpr T& get() 
{
    static_assert(I < N);       
    return coord[I];
}
};
int main() {
    Vect<int, 10> v;
    v.get<9>();   // OK
    v.get<10>();  // Ошибка компиляции  
}

Подобный функционал уже имеется в стандартной библиотеке при использовании std::get на std::array.

READ ALSO
Как создать бесконечный цикл

Как создать бесконечный цикл

Как звучит задача:

712
Преобразование Mat в byte[] и обратно

Преобразование Mat в byte[] и обратно

Необходимо получить класс Mat, провести с ним манипуляции и сохранить в byte[], с последующим восстановлением byte[] в MatНаписал простейший пример:

180
UnixException on Mac

UnixException on Mac

Начал получить ошибку на Mac при попытке записать pdf файл в папку tempВернее, приложение должно записывать туда файл, но не записывает (исключения...

165
Exception in thread &ldquo;main&rdquo; java.lang.ArrayIndexOutOfBoundsException: 1 at Main.main(Main.java:15) Why?

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 1 at Main.main(Main.java:15) Why?

Если я в 15 строке заменяю на простое, обыкновенное число (не digitnextInt()), то все работает по плану!

170