C++11 std::pair的switch语句?

C++11 std::pair的switch语句?,c++11,switch-statement,pattern-matching,C++11,Switch Statement,Pattern Matching,我想切换两个整数的可能值,或者在另一种情况下切换两个布尔值。为了便于讨论,假设我已经完成了 auto mypair = std::make_pair(foo, bar); 我怎样才能达到相当于 switch(mypair) { case make_pair(true, false): cout << "true and false"; break; case make_pair(false, true) cout << "false and true"; break;

我想切换两个整数的可能值,或者在另一种情况下切换两个布尔值。为了便于讨论,假设我已经完成了

auto mypair = std::make_pair(foo, bar);
我怎样才能达到相当于

switch(mypair) {
case make_pair(true, false): cout << "true and false"; break;
case make_pair(false, true)  cout << "false and true"; break;
case default: cout << "something else";
}
开关(mypair){

case make_pair(true,false):coutC++的switch语句没有许多其他语言的模式匹配能力。您需要采取稍微不同的方法

这是我提出的一个可能性:

pair_switch(my_pair,
    std::make_tuple(true, false, []{ std::cout << "true and false"; }),
    std::make_tuple(false, true, []{ std::cout << "false and true"; }));

您只能打开整数类型,但是如果您可以设计一个函数将您的对(或任何复杂类型)映射到整数类型,您可以将其声明为
constepr
(C++11),以指示它可以在编译时解析。然后它可以作为case表达式

简单的例子:

enum Action { peel, eat, juice };
enum Fruit { apple, orange, banana };

constexpr unsigned int switch_pair(Action a, Fruit f) {
   return (a << 16) + f;
}
enum动作{剥、吃、榨汁};
枚举水果{苹果、橘子、香蕉};
constexpr无符号整数开关对(动作a、动作f){

返回(a我想可能会有帮助。在继续之前,请特别了解预期的条件以及如何定义case语句的常量表达式。您对代码片段的期望是什么?好的,在任何情况下,您都应该得到+1,至少对于您使用
初始值设定项列表
填充cases数组的方式而言。起首部分。是吗该语句只是将参数包展开到数组中(因此丢弃列表是有意义的)或者还有另一个我看不到的目的?我喜欢
,0
部分,真的,从来没有想过用这样的方法来展开包,真的很聪明!!它利用了这样一个事实,即你可以在
初始值设定项列表
的上下文中解包参数包,然后作为副作用填充数组并丢弃
初始值设定项列表
。这当折叠表达式出现在语言中时,丑陋将得到修复。好吧,它按照我的理解工作,很好。真的很有趣,是个好主意。折叠表达式的意思是202y,我错了吗?@skypjack希望1z/17Wow-这是我第一次看到一个constexpr用例,它是我的代码库的编码胜利。喜欢它!谢谢!
enum Action { peel, eat, juice };
enum Fruit { apple, orange, banana };

constexpr unsigned int switch_pair(Action a, Fruit f) {
   return (a << 16) + f;
}
switch(switch_pair(mypair.first,mypair.second))
{
   case switch_pair(peel,apple):  std::cout << "Peeling an apple" << std::endl; break;
   case switch_pair(eat,apple):   std::cout << "Eating an apple" << std::endl; break;
   case switch_pair(juice,apple): std::cout << "Juicing an apple" << std::endl; break;
   default:
      throw std::runtime_error("We only have apples!");
}