#c
Вопрос:
У меня есть класс C со статическим массивом constexpr. Я хотел бы присвоить ему значение, равное другой функции-члену класса. Прямо сейчас у меня есть текущее решение, но я чувствую, что оно довольно неоптимально, и функция больше не привязана к классу.
static constexpr std::array<Degrees, 270> angles()
{
std::array<Degrees, 270> angles;
for (size_t i = 0; i < angles.size(); i )
{
angles[i] = static_cast<double>(i - 90.0) * (std::numbers::pi / 180.0);
};
return angles;
}
class MyClass
{
static constexpr std::array<Degrees, 270> angles = angles();
}
Существует ли лучший подход для инициализации статического члена класса constexpr в подобной функции? В идеале я бы сделал это , используя функцию-член MyClass
, с реализацией, определенной в файле .cpp вместо заголовка.
Комментарии:
1. «равно функции» или «равно результату вызова функции»?
2. И нет, вы не можете скрыть детали реализации
constexpr
кода из открытого файла заголовка.
Ответ №1:
Если вы хотите , чтобы ваш участник был constexpr
, вы должны поместить инициализацию в файл заголовка.
Что касается вашей инициализации, вы можете встроить вызов функции, используя лямбду, например:
class MyClass
{
static constexpr auto angles = []
{
std::array<Degrees, 270> angles;
for (size_t i = 0; i < angles.size(); i )
{
angles[i] = static_cast<double>(i - 90.0) * (std::numbers::pi / 180.0);
};
return angles;
}();
};
Комментарии:
1. Я бы
auto
выбрал тип переменной. Сохраняет его немного суше, так как он все равно должен быть указан в лямбде.2. @Рассказчик-исправлена неландермоника