C ++:在开关中使用std :: pair的可能性

时间:2018-07-26 11:17:22

标签: c++ c++11

我写了例子。我想在切换条件下使用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;
}

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。要实现动态的切换/类似情况的行为,您将需要使用其他一些方法,例如映射值。