【发布时间】:2016-08-30 08:33:29
【问题描述】:
我有一个有 4 种索引类型的数据库。每个索引类型都有一个排序顺序。也就是说,如果您知道静态索引类型,那么就有一个正确的函子可用于对该索引中的对象进行排序,并且只要您知道索引类型,即在编译时静态地,它也被称为。
数据库有一个函数,它包含一个运行时 switch 语句来决定与哪个索引对话。我希望该函数从索引(主要是迭代器)返回运行时信息,还希望使用静态订单类型。
为了表明意图,这里有一些伪代码。它不能按原样工作......是否可以使用模板特化来编写 getLookupInfo (返回类型将是多态的)。注意:我不想使用虚拟。
template <typename Iterator, typename Order>
struct LookupInfo {
typedef Order order;
uint64_t cost;
Iterator it1, it2, it3, it4;
};
LookupInfo Database::getLookupInfo(LookupData data)
{
if (data == ....) {
return LookupInfo<Iterator1, Order1>();
}
return LookupInfo<Iterator2, Order2>();
}
some_function(LookupInfo lookup_info) {
vector<Record> records(lookup_info.begin(), lookup_info.end());
sort(records.begin(), records.end(), lookup_info::order());
}
这样的事情可能吗?
【问题讨论】:
-
我很好奇您期望
getLookupInfo的工作方式。我不明白它怎么可能被调用。返回语句与返回类型不匹配,这意味着您需要多态或模板特化。 -
安迪 - 是的 - 这就是我无法关闭循环的地方。代码 sn-p 将不起作用,它更旨在显示我想做的事情。你是对的,诀窍是让 getLookupInfo 的返回类型每次都返回不同的类型。我不想要虚拟,所以我想使用模板专业化。但即使是恕我直言也很棘手。我的问题的本质大概是:如何使用模板特化来写getLookupInfo?
-
诀窍是把所有东西都变成一个类型......如果你给我一些你想如何调用它的伪代码(没有模板专业化),我可能会提供帮助。
-
OK - getLookupInfo 中的内容也可能是一个 int,它的值决定了使用哪种类型的 Order。 getLookupInfo 出来的应该是类似于上面的 LookupInfo 的东西,它携带一些东西,加上类型 Order。如果 virtuals 是可能的,我猜 LookupInfo 上会有一个 virtual 来检索 Order 的实例。这有意义吗?
-
如果您将所有可能的
LookupInfo类型存储在一个元组中,而getLookupInfo将结果存储在该元组中,并返回一个索引呢?您还需要模板some_function。还要检查boost fusion,这可能对您的问题很有趣
标签: c++ templates c++11 metaprogramming template-meta-programming