C++ metaprogramming Hellow

example 1:

 1 template<size_t N>
 2 struct Fac {
 3     enum {
 4         value = Fac<N - 1>::value +N,
 5     };
 6 };
 7 
 8 template<>
 9 struct Fac<0> {
10     enum {
11         value = 0,
12     };
13 };

 

example 2:

 1 template<size_t N>
 2 struct Fac1 {
 3     
 4     static constexpr size_t    value = Fac1<N - 1>::value + N;
 5 };
 6 
 7 template<>
 8 struct Fac1<0> {
 9     
10     static constexpr size_t    value = 0;
11 };

 

example 3:

 1 template<size_t N>
 2 struct SumUp {
 3     enum {value = SumUp<N-1>::value + N};
 4 };
 5 
 6 template<>
 7 struct SumUp<0> {
 8     enum { value = 0 };
 9 };
10 
11 template<size_t N>
12 struct Fac {
13     enum {
14         value = Fac<N - 1>::value +N,
15     };
16 };

 

The most significant difference (since C++17 avoids the need for an out-of-class definition for the static data member) is that enumerators are instantiated along with the containing class, whereas static data members are instantiated only when needed. (Note, however, that MSVC, at least, doesn’t always properly defer them.)

 

这其实是因为常量表达式最初只能用enum来声明,但后来(实际上是C++98)允许在类内部初始化static int常量:

上一篇:2021-07-28


下一篇:理解指针(三)-字符串与字符数组