编译时计数器

时间:2019-01-13 23:24:24

标签: c++ metaprogramming template-meta-programming

您能告诉我我的应用程序中实际发生了什么吗?当我期望“ 0 1 2”时,我的程序的结果是“ 0 1 1”,依此类推...

#include <iostream>

template<int N>
struct counter {
    friend constexpr int get(counter<N>);
};

template<int N>
struct writer {
    friend constexpr int get(counter<N>) {
        return N;
    }
};

template<int N, bool B = noexcept(get(counter<N + 1>()))>
struct GetMaxCounter
{
    static constexpr int max = GetMaxCounter<N + 1>::max;
};

template<int N>
struct GetMaxCounter<N, false>
{
    static constexpr int max = N;
};

int main()
{
    std::cout << GetMaxCounter<0>::max << std::endl;
    writer<1>();
    std::cout << GetMaxCounter<0>::max << std::endl;
    writer<2>();
    std::cout << GetMaxCounter<0>::max << std::endl;
}

当我第三次调用GetMaxCounter <0> :: max时会发生什么?模板参数B是否应重新评估为“ true”?

1 个答案:

答案 0 :(得分:0)

答案很晚,但是问题是由于您只有GetMaxCounter<N>类的两个“版本”,即GetMaxCounter<N, false>GetMaxCounter<N, true>

基本上,在第一次调用max时,GetMaxCounter<0,false>::max成员固定为GetMaxCounter<0>::max(== 0),当调用writer<1>时,GetMaxCounter<0,true>::max被定义为GetMaxCounter<1, false>::max(== 1)。

无论您是否呼叫writer<2>,任何后续GetMaxCounter<0>都将被评估为GetMaxCounter<0, true>,其中GetMaxCounter<0, true>::max先前被定义为GetMaxCounter<1, false>::max,并且不会改变。