在constexpr中使用boost数学常量

时间:2014-02-10 21:51:06

标签: c++ boost c++11 constexpr

是否可以在constexpr中使用boost数学常量?

例如,以下行:

static constexpr double SEC3 = static_cast<double>(45)/180*boost::math::double_constants::pi;

给我错误

Error - constexpr variable 'SEC3' must be initialized by a constant expression

但如果我用简单的M_PI替换升压代码,它就可以正常工作。

2 个答案:

答案 0 :(得分:3)

我怀疑这可能是原因。 Coliru出现此错误:

clang++ -std=c++1y -O2 -Wall -pedantic -pthread main.cpp && ./a.out

/usr/local/include/boost/math/constants/constants.hpp:248:52: note: expanded from macro 'BOOST_DEFINE_MATH_CONSTANT'

   namespace double_constants{ static const double name = x; } \

如果它被定义为const而不是constexpr,那么这可能是它拒绝代码的原因。为了让自己放心是问题的根源,我们可以使用此测试用例重现错误:

// This code fails
#include <boost/math/constants/constants.hpp>
namespace double_constants{ static const double name = 25; }

static constexpr double SEC3 = static_cast<double>(45)/180*double_constants::name;

那么我们该如何解决这个问题呢?不要使用non-templated version。 Boost提供了我们可以使用的templated version

static constexpr double SEC3 = static_cast<double>(45)/180*boost::math::constants::pi<double>();

clang 3.5还使用C ++ 1y模式实现变量模板:

template <class T>
static constexpr T SEC3 = static_cast<T>(45)/180*boost::math::constants::pi<T>();

int main()
{
    std::cout << SEC3<double>;
}

答案 1 :(得分:1)

当我在寻找使用boost库将pi定义为constexpr double的最简洁方法时,我看到了这篇文章。以下代码片段在Visual Studio 2017中使用boost 1_66_0:

可以很好地适用于我
#include <boost/math/constants/constants.hpp>
constexpr double pi = boost::math::constants::pi<double>();