C++中的声明式编程

xto*_*ofl 5 c++ frameworks declarative

我经常面临将一个 API 的参数空间映射到另一个 API 的参数空间的问题。我经常看到这个问题是通过嵌套嵌套的... 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 } };
}
Run Code Online (Sandbox Code Playgroud)

其中映射通常是这样完成的

switch( a ){
  case( A::A1 ): switch( b ) {
     case( B::B1 ): return A1B1;
     case( B::B2 ): return A1B2;
     ....
}
Run Code Online (Sandbox Code Playgroud)

而且这个映射仍然需要一个“反向”开关。

但我更喜欢“密集”的东西

declare( source( A::A1, B::B1 ), target( AB::A1B1 ) );
declare( source( A::A1, B::B2 ), target( AB::A1B2 ) );
....
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*lis 3

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

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

不过,它确实允许您定义与示例一样密集的映射;通常,您只需将对添加到地图中,一次一对。