|
问题是这样:
想获取 \(6\sigma\) 中的某一个值,在 C++11 之前是这么做的:- #define _1_SIGMA_ 0.3085375#define _2_SIGMA_ 0.6914625#define _3_SIGMA_ 0.9331928#define _4_SIGMA_ 0.9937903#define _5_SIGMA_ 0.9997674#define _6_SIGMA_ 0.9999966#define SIGMA( n ) ( _##n##_SIGMA_ )
复制代码
而如今,采用 C++17 标准后,我们可以这么写了:- inline constexpr double SIGMA( std::size_t n ) noexcept{ constexpr double sigma[]{ 0.0, 0.3085375, 0.6914625, 0.9331928, 0.9937903, 0.9997674, 0.9999966 }; return sigma[ n ];}
复制代码
其实上面那个数组 sigma 是没有必要的(甚至无需给它命名),可以改写成如下:- inline constexpr auto SIGMA( std::size_t n ) noexcept{ using D7 = double[ 7 ]; return D7{ 0.0, 0.3085375, 0.6914625, 0.9331928, 0.9937903, 0.9997674, 0.9999966 }[ n ];}
复制代码
以上皆能编译通过。
但是,我觉得仍不够“优雅”,觉得理想的代码应该是下面的:- inline constexpr auto SIGMA( std::size_t n ) noexcept{ return { 0.0, 0.3085375, 0.6914625, 0.9331928, 0.9937903, 0.9997674, 0.9999966 }[ n ];}
复制代码 不过,很可惜,无 法 通 过 编 译 !
如果是你,用 C++ 会如何实现它?并尽可能保持优雅。。。 |
|