我遇到了this关于如何在C ++中实现编译时计数器的问题。
作者提供了this interesting article。我稍微修改了它并编译了它a workaround for Visual C++,当用Visual C ++编译时它确实有效。
#include <iostream>
template<int N>
struct flag {
friend constexpr int adl_flag (flag<N>);
};
template<int N>
struct writer {
friend constexpr int adl_flag (flag<N>) {
return N;
}
static constexpr int value = N;
};
template<int N, class = char[noexcept(adl_flag(flag<N> ()))?+1:-1]>
int constexpr reader (int, flag<N>) {
return N;
}
template<int N>
int constexpr reader (float, flag<N>, int R = reader (0, flag<N-1> ())) {
return R;
}
int constexpr reader (float, flag<0>) {
return 0;
}
template<int N = 1, int C = reader (0, flag<32> ())>
int constexpr next (int R = writer<C + N>::value) {
return R;
}
int main () {
constexpr int a = next();
constexpr int b = next();
constexpr int c = next();
std::cout << a << " " << b << " " << c << std::endl;
static_assert (a == 1 && b == a+1 && c == b+1, "try again");
}
用VC ++输出
1 2 3
但是,该代码中的断言对online和GCC都失败了。在评论断言时,clang:
1 1 1
这种解决方法是利用VC ++中的错误还是应该在GCC / clang中工作?