Не использовать constexpr в аргументах шаблона C ++ - PullRequest
2 голосов
/ 30 апреля 2020

Я работаю с переменной типа itk::Image<OutputPixelType, Dimension>, где "itk" происходит из библиотеки обработки изображений ITK.

Следующий код компилируется:

constexpr unsigned int Dimension = 3;
using PixelType = float; 
using MyImageType = itk::Image<PixelType, Dimension>;

Но теперь я нужно определить «измерение» как то, что вычисляется из функции.

unsigned int Dimension = get_dimension(...);

Мой компилятор выдает ошибку:

error: non-type template argument is not a constant expression
  using MyImageType = itk::Image<PixelType, Dimension>;
                                            ^~~~~~~~~

Как можно обойти эту проблему? Я надеюсь использовать «Измерение» как нечто вычисленное из функции.

1 Ответ

7 голосов
/ 30 апреля 2020

Ваша get_dimension функция должна быть constexpr, и, если это так, вы можете иметь следующее:

constexpr unsigned int Dimension = get_dimension(...);

Пример

Давайте скажем, у вас есть следующий упрощенный класс:

template <int v>
class Foo {
public:
    constexpr Foo()
        : v_(v)
    {}

private:
    int v_;
};

, а затем следующее:

int v = get();
using FooInt = Foo<v>;

, где get функция определяется следующим образом:

int get() {
    return 1;
}

Вы получите то же самое, что и ошибка, полученную в вашем примере.

Следовательно, решение будет означать get функцию constexpr и также значение v. constexpr как:

constexpr int get() {
    return 1;
}

constexpr int v = get();
using FooInt = Foo<v>;

Взгляните на демо

ОБНОВЛЕНИЕ

Чтобы иметь возможность чтобы использовать шаблоны, компилятору необходимо знать параметры шаблона во время компиляции, и поэтому, если Dimension не является переменной constexpr (которая объявляет, что можно оценить значение переменной во время компиляции), она не может быть используется в качестве параметра шаблона.

...