编译时间计数器

问题描述 投票:0回答:1

您能告诉我我的应用程序中实际发生了什么吗?当我期望“ 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”?

c++ metaprogramming template-meta-programming
1个回答
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,并且不会改变。

© www.soinside.com 2019 - 2024. All rights reserved.