Я хочу написать класс, который использует числовую квадратуру. Квадратурный порядок определяет размер некоторых контейнеров, которые я буду использовать. Я хотел бы сделать псевдоним типа для таких контейнеров, и он должен зависеть от квадратурного порядка.
Следующий код показывает мои испытания. Это кажется неоптимальным в том смысле, что я должен повторить порядок в определении псевдонима типа:
#include <array>
class Quadrature
{
public:
static constexpr unsigned int getOrder()
{
return 3;
}
// This line doesn't compile!
//
// using WeightsContainer = std::array<double, getOrder()>;
//
// g++ says "error: 'static constexpr unsigned int Quadrature::getOrder()'
// called in a constant expression before its definition is complete"
// This line compiles, but repeats the order. :-(
using WeightsContainer = std::array<double, 3>;
private:
WeightsContainer container;
};
Одно решение, которое я нашел, представляет параметр шаблона Order
. Но на самом деле я хотел определить квадратурный порядок, и введение параметра шаблона сделало бы его переменным.
Есть ли возможность сделать заказ постоянной времени компиляции и использовать его в моем определении псевдонима типа?
Edit:
Для полноты я мог бы, конечно, использовать определение препроцессора. Но это чувствует себя старомодным. : -)
Редактировать 2:
Хорошо, я нашел другую возможность. Я мог бы добавить функцию вне области видимости этого класса:
constexpr unsigned int order()
{
return 3;
}
Но это не так, потому что это свойство класса и, следовательно, должно быть в рамках класса!