c++:在switch中使用std::pair的可能性

c++: the possibility of using std::pair in switch

本文关键字:std pair 可能性 switch c++      更新时间:2023-10-16
我写了一个例子。我想在切换条件下使用std::对,但编译器告诉我:

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;
}

切换条件可以是整型或枚举型。将类作为开关条件传递需要它是可转换的。

9.4.2切换语句[stmt.switch]

2条件应为积分类型、枚举类型或类类型。如果是类类型,则条件在上下文中隐式转换(第7条(为整型或枚举类型。如果(可能转换的(类型受到整体提升(7.6(,则条件转换为提升类型。switch语句中的任何语句都可以用一个或多个case标签进行标记,如下所示:

大小写常量表达式:

其中常数表达式应为开关状态。

如果要使用类作为开关值,则需要将其constexpr转换为相应的整数或枚举器类型:

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不符合这些要求,因此不能用作开关(或机箱(条件。但此代码的实际问题是,提供给case的值t不是constexpr。要实现动态切换/类似案例的行为,您需要使用一些其他方法,例如映射值。