c++:在switch中使用std::pair的可能性
c++: the possibility of using std::pair in switch
我写了一个例子。我想在切换条件下使用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。要实现动态切换/类似案例的行为,您需要使用一些其他方法,例如映射值。
相关文章:
- c++:在switch中使用std::pair的可能性
- 将从std::映射中获取的std::pair引用传递给接受std::对引用的函数
- Hash for a std::pair, for use in an unordered_map
- 类模板的参数太少 "std::pair":在函数中将 std 对作为参数传递
- 接收std :: Pair作为参数并从支撑列表初始化中推论的模板函数
- std::pair中的template-template参数
- std::experimental::ostream_joiner and std::pair
- 如何将两个std :: vector结合到一个std :: vector与std :: pair
- 错误 C2678:二进制'==':找不到采用 'std::pair<const _Kty,_Ty>' 型左操作数的运算符
- C++错误处理-使用std::pair或std::tuple返回错误代码和函数返回的缺点
- 将std::pair转换为具有任意数量元素的std::tuple
- 宏MOCK_METHOD传递了3个参数,但std::pair只接受了2个错误
- push_back std::pair into std::vector error
- 如何返回std::pair的内容
- 谷歌模拟成员函数中的std::pair参数编译失败
- 无法正确地向java绑定公开std::pair
- std::pair抱怨类型不完整
- std::pair的默认构造函数<>将基本类型(int等)设置为零
- Emplacing a std::pair
- 创建一个以std::pair为键的std::unordered_map