两组类之间的映射

时间:2010-03-01 18:39:42

标签: c++

我有一个要求,我在哪里有一组课程,并且他们与另一组课程有一对一的对应关系。考虑这样的事情

A)

 template < class A >

class Walkers
{
     int walk( Context< A >* context );
};

Context类的集合不是模板。他们是个人班级。我需要在这两组之间创建一个映射。我想到的一种方法是创建一个类型列表并在适当的位置引用该类。但我觉得这更容易出错,因为我可能会在类型列表中与上下文不匹配。有人可以告诉我怎么做吗?

谢谢, 戈库尔。

3 个答案:

答案 0 :(得分:1)

我不确定你想要做什么,你的要求或目标是什么,但你可以尝试使用特征来定义关系:

// direct mapping
template <typename T>
struct context_of;

template <>
struct context_of<A> {
   typedef ContextA type;
};

// reverse mapping
template <typename T>
struct from_context;

template <>
struct from_context< ContextA > {
   typedef A type;
};

您发布的代码将写为:

template <typename T>
class Walker {
public:
   typedef typename context_of<T>::type context_type;
   int walker( context_type* context );
};

要减少键入,您可以使用类型列表构建映射(可能很复杂),或者您可能希望使用辅助宏(更脏,更简单):

#define GENERATE_CONTEXT_ENTRY( the_class, the_context ) \
   template <> struct context_of< the_class > { \
      typedef the_context type; }; \
   template <> struct from_context< the_context > \
      typedef the_class type; };

GENERATE_CONTEXT_ENTRY( A, ContextA );
GENERATE_CONTEXT_ENTRY( B, ContextB );

#undef GENERATE_CONTEXT_ENTRY

答案 1 :(得分:0)

您可以制作Context类模板并使用模板专门化来实现它们吗?

答案 2 :(得分:0)

使用boost :: mpl:

using boost::mpl;
typedef map< pair< A, ContextA >,
             pair< B, ContextB > > context_type_map;

template <typename T>
class Walker {
public:
   typedef at< context_type_map, T >::type context_type;
   int walker( context_type* context );
};

事实上,我相信您可以使用几乎任何类型的容器(boost::mpl::vector)来存储对,并使用boost::mpl::find_if一个谓词来提取该对的第一个元素并进行比较。