C ++传输运行时条件类型信息

时间:2016-05-04 18:44:57

标签: c++ templates c++11 metaprogramming template-meta-programming

我有一个有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());
}

这种情况有可能吗?

1 个答案:

答案 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);