我写了例子。我想在切换条件下使用std :: pair,但是编译器说:
0)在自己的初始值设定项中使用“ t”;
1)“'t'的值不能在常量表达式中使用”
是否有可能做出类似的事情或者它是愚蠢的,所以我需要阅读标准。 最好的问候。
#include <iostream>
#include <functional>
using namespace std;
bool Task() {
std::cout<<"Hello Stack!" <<std::endl;
}
template<typename T>
void check_case(const uint8_t key, T val) {
constexpr auto t = std::pair<std::function<bool()>, uint8_t>([=] { return Task(); }, 0);
switch (val) {
case 0: {
std::cout << "val are uint8" << std::endl;
}break;
case t: {
std::cout << "val are pair" << std::endl;
}break;
}
}
int main() {
uint8_t key = 0;
uint8_t val = 0;
check_case(key, val);
auto t = std::pair<std::function<bool()>, uint8_t>([=] { return Task(); }, 0);
check_case(key, t);
return 1;
}
答案 0 :(得分:3)
开关条件可以是整数或枚举类型。将类作为切换条件传递时,要求它们都可以转换。
9.4.2 switch语句[stmt.switch]
2条件应为整数类型,枚举类型或类类型。如果为类类型,则条件在上下文中隐式转换(第7条)为整数或枚举类型。如果(可能是转换的)类型要接受整体提升(7.6),则条件将转换为提升的类型。 switch语句中的任何语句都可以用一个或多个case标签标记,如下所示:
case常量表达式:
其中,常量表达式应为转换后的常量类型的常量表达式(8.20), 切换条件。
如果要使用class作为开关值,则需要将它可进行constexpr转换为相应的整数或枚举器类型:
location / {
proxy_pass https://example.com;
proxy_set_header X-Real-IP example.com;
proxy_set_header X-Forwarded-For example.com;
proxy_set_header Host example.com;
}
由于class Foo
{
public: int m_v{};
public: constexpr
operator int(void) const
{
return m_v;
}
};
int main()
{
Foo x{};
switch(x)
{
case Foo{1}: break;
case Foo{2}: break;
}
}
不符合这些要求,因此不能用作切换(或大小写)条件。但是此代码的实际问题是提供给std::pair
的值t
不是constexpr。要实现动态的切换/类似情况的行为,您将需要使用其他一些方法,例如映射值。