我有一个有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());
}
这种情况有可能吗?
答案 0 :(得分:0)
你可以通过折叠你的getLookupInfo - &gt;来做到这一点。将some_function序列应用于单个调度序列。首先,让我们更正some_function的定义,以反映它是模板函数的事实:
template<typename LookupInfo>
void some_function(LookupInfo lookup)
{
vector<Record> records(lookup_info.begin(), lookup_info.end());
sort(records.begin(), records.end(), lookup_info::order());
}
接下来,介绍一个帮助函子来调用它(由于我在下面讨论的原因,我不能跳过这个,就像我想的那样):
template<typename LookupInfo>
struct some_functor
{
void operator()(LookupInfo lookup_info)
{
some_function<LookupInfo>(lookup_info);
}
};
现在发送技巧。忘记上面的getLookupInfo函数,而是定义:
template<template <class L> class F>
void dispatchLookupInfo(int data)
{
if (data == 0) {
auto lookup = LookupInfo<Iterator1, Order1>();
F<LookupInfo<Iterator1, Order1>> fn;
fn(lookup);
}
else {
auto lookup = LookupInfo<Iterator2, Order2>();
F<LookupInfo<Iterator2, Order2>> fn;
fn(lookup);
}
}
请注意,我假装data
是一个你所说的int。因此,您可以看到而不是获取LookupInfo然后单独调用该函数,我们一次性完成。这里dispatchLookupInfo采用模板模板参数,因此它可以专门化任何函数。这又回到了我需要一个帮助函子的地步:我无法找到一种方法来传递函数模板(而不是类模板)作为模板模板参数。但是,它很笨重,我相信它满足您不涉及虚拟呼叫的要求。您的最终调用可能如下所示:
dispatchLookupInfo<some_functor>(0);