Compile time operations on floating point types
我有一些静态const浮点成员变量,我想在这些变量上进行一些静态断言的编译。以下代码在gcc中编译,但在clang和Visual Studio中均失败:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <boost/static_assert.hpp> #include <iostream> template<typename Scalar> class ProbModel { public: static const Scalar probA; static const Scalar probB; private: BOOST_STATIC_ASSERT_MSG(probA < 1,"Weird Parameter"); BOOST_STATIC_ASSERT_MSG(probB < 1,"Weird Parameter"); BOOST_STATIC_ASSERT_MSG(probA < probB,"Weird Parameter"); }; // Initializations template<typename Scalar> const Scalar ProbModel<Scalar>::probA = 0.3; template<typename Scalar> const Scalar ProbModel<Scalar>::probB = 0.6; int main(int argc, char* argv[]) { typedef ProbModel<float> Modelf; std::cout <<"ProbA =" << Modelf::probA << std::endl; } |
我在Visual Studio 2013和Clang中收到抱怨常量表达式的静态断言语句错误:
1 2 3 | 2>..\\static_assert_experiments.cpp(11): error C2057: expected constant expression 2>..\\static_assert_experiments.cpp(12): error C2057: expected constant expression 2>..\\static_assert_experiments.cpp(13): error C2057: expected constant expression |
一个非c 11的解决方案将受到高度赞赏。还有其他方法可以对静态参数进行此类检查吗?
如注释中的dyp所述,不能在常量表达式中使用浮点类型的变量。可能的解决方法是使用有理数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | template<typename Scalar> class ProbModel { public: static Scalar getProbA() { return Scalar(probA::num) / probA::den; } static Scalar getProbB() { return Scalar(probB::num) / probB::den; } private: typedef std::ratio<3, 10> probA; // 0.3 typedef std::ratio<6, 10> probB; // 0.6 BOOST_STATIC_ASSERT_MSG(probA::num < probA::den,"Weird Parameter"); BOOST_STATIC_ASSERT_MSG(probB::num < probB::den,"Weird Parameter"); BOOST_STATIC_ASSERT_MSG(probA::num * probB::den < probB::num * probA::den,"Weird Parameter"); }; |