constexpr 技巧
Constexpr tricks
我认为这是不可能的,但在放弃之前我想问问你。
我想要类似 constexpr 增量的东西。
#include <iostream>
constexpr int inc() {
static int inc = 0;
return inc++;
}
class Foo {
static const int Type = inc();
};
class Foo2 {
static const int Type = inc();
};
int main() {
std::cout << "Foo1 " << Foo1::Type << st::endl;
std::cout << "Foo2 " << Foo2::Type << st::endl;
return 0;
}
我想将它调用到某些 类 中,而不是手动 (我为此使用 CRTP),为它们中的每一个提供不同的类型,但是类型需要是常量。
无论如何在 C++ 中实现类似的东西? (C++17 + TS)
所以Filip Roseen called the constant-expression counter有解决方案:
#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, int = adl_flag (flag<N> {})>
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 constexpr next (int R = writer<reader (0, flag<32> {}) + N>::value) {
return R;
}
class Foo {
public:
static const int Type = next();
};
class Foo2 {
public:
static const int Type = next();
};
int main() {
std::cout << "Foo1 " << Foo::Type << std::endl;
std::cout << "Foo2 " << Foo2::Type << std::endl;
return 0;
}
谢谢大家:)
但是在我的主库中使用它太冒险了,每个项目都会用到它。
PS:如果还有其他答案,我现在不会关闭这个。因为是的,它很丑。
我认为这是不可能的,但在放弃之前我想问问你。
我想要类似 constexpr 增量的东西。
#include <iostream>
constexpr int inc() {
static int inc = 0;
return inc++;
}
class Foo {
static const int Type = inc();
};
class Foo2 {
static const int Type = inc();
};
int main() {
std::cout << "Foo1 " << Foo1::Type << st::endl;
std::cout << "Foo2 " << Foo2::Type << st::endl;
return 0;
}
我想将它调用到某些 类 中,而不是手动 (我为此使用 CRTP),为它们中的每一个提供不同的类型,但是类型需要是常量。 无论如何在 C++ 中实现类似的东西? (C++17 + TS)
所以Filip Roseen called the constant-expression counter有解决方案:
#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, int = adl_flag (flag<N> {})>
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 constexpr next (int R = writer<reader (0, flag<32> {}) + N>::value) {
return R;
}
class Foo {
public:
static const int Type = next();
};
class Foo2 {
public:
static const int Type = next();
};
int main() {
std::cout << "Foo1 " << Foo::Type << std::endl;
std::cout << "Foo2 " << Foo2::Type << std::endl;
return 0;
}
谢谢大家:) 但是在我的主库中使用它太冒险了,每个项目都会用到它。
PS:如果还有其他答案,我现在不会关闭这个。因为是的,它很丑。