我经常遇到将一个API的参数空间映射到另一个API的参数空间的问题。我经常看到通过嵌套的nested ... switch语句解决了这个问题。

我想知道是否会出现一个库或一种技术,让您“声明”映射而不是“编程”它。

一个简单的示例包括将两个枚举的值合并为一个:

namespace sourceAPI {
  struct A { typedef e { A1, A2, A3 } };
  struct B { typedef e { B1, B2 } };
}

namespace targetAPI {
  struct AB { typedef e { A1B1, A1B2, A2B1, A2B2, A3B1, A3B2 } };
}

映射通常是这样完成的
switch( a ){
  case( A::A1 ): switch( b ) {
     case( B::B1 ): return A1B1;
     case( B::B2 ): return A1B2;
     ....
}

而且此映射仍然需要“反向”切换。

但是我想要一些“密集”的东西
declare( source( A::A1, B::B1 ), target( AB::A1B1 ) );
declare( source( A::A1, B::B2 ), target( AB::A1B2 ) );
....

有没有人看过这样的技术,框架或库?

最佳答案

您可以使用Boost.Bimap,它提供了两种类型之间的双向映射。

它有一些运行时开销(通常,为此目的使用一对std::map会获得大致相同的开销,这不是很多)。

但是,它确实允许您像示例一样密集地定义映射。通常,您只需在 map 上添加一对,即可一次添加一对。

09-06 10:24