Ваша 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
(которая объявляет, что можно оценить значение переменной во время компиляции), она не может быть используется в качестве параметра шаблона.