我有一个要求,我在哪里有一组课程,并且他们与另一组课程有一对一的对应关系。考虑这样的事情
A)
template < class A >
class Walkers
{
int walk( Context< A >* context );
};
Context类的集合不是模板。他们是个人班级。我需要在这两组之间创建一个映射。我想到的一种方法是创建一个类型列表并在适当的位置引用该类。但我觉得这更容易出错,因为我可能会在类型列表中与上下文不匹配。有人可以告诉我怎么做吗?
谢谢, 戈库尔。
答案 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
一个谓词来提取该对的第一个元素并进行比较。