Присвоение статического члена constexpr, равного статической функции constexpr?

#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. @Рассказчик-исправлена неландермоника