статические функции переменная функция 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 ответ:
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, это может быть предпочтительным способом делать вещи. Если вы используете более старую версию стандарта, первые два абзаца все еще сохраняются.
Comments