статические функции переменная функция constexpr против


есть ли разница между объявлением константы с плавающей запятой как static constexpr переменной и функции, как в примере ниже, или это просто вопрос стиля?

class MY_PI
{
public:
    static constexpr float MY_PI_VAR = 3.14f;
    static constexpr float MY_PI_FUN() { return 3.14f; }
}
1   51   2013-04-30 00:36:43

1 ответ:

constexpr функции

функции имеют преимущество, которое свободные переменные не имеют (до C++14 то есть): они могут быть легко шаблонизированы без некоторого шаблона класса. Это означает, что вы можете иметь свой pi С точностью в зависимости от аргумента шаблона:

template<typename T>
constexpr T pi();

template<>
constexpr float pi() { return 3.14f; }

template<>
constexpr double pi() { return 3.1415; }

int main()
{
    constexpr float a = pi<float>();
    constexpr double b = pi<double>();
}

однако, если вы решили использовать static функция-член вместо свободной функции, это не будет короче и проще писать, чем член.

constexpr переменные

главным преимуществом использования переменной является то, что... что ж. Ты же хочешь постоянную, да? Это проясняет намерения и это может быть одним из самых важных моментов здесь.

вы все еще можете иметь эквивалентное поведение с классом, но тогда вам придется использовать его так, если ваш класс является классом, содержащим разные математические константы:

constexpr float a = constants<float>::pi;

Или вот так, если ваш класс предназначен только для представляю pi:

constexpr double = pi<double>::value;

в первом случае вы можете предпочесть использовать переменные, так как это будет короче писать, и это действительно покажет, что вы используете константу и не пытаетесь что-то вычислить. Если у вас просто есть класс, представляющий pi, вы можете, однако, пойти с бесплатным constexpr функция вместо целого класса. ИМХО было бы проще.

C++14:constexpr переменной шаблоны

однако, обратите внимание, что если вы выбираете чтобы использовать C++14 вместо C++11, вы сможете написать следующий вид constexpr переменной шаблонов:

template<typename T>
constexpr T pi = T(3.1415);

это позволит вам написать свой код следующим образом:

constexpr float a = pi<float>;

начиная с C++14, это может быть предпочтительным способом делать вещи. Если вы используете более старую версию стандарта, первые два абзаца все еще сохраняются.