0

У меня есть база данных, которая имеет 4 типа индексов. Каждый тип индекса имеет порядок сортировки. То есть, если вы знаете тип статического индекса, то есть один правильный функтор для сортировки объектов в этом индексе, и он также известен, как только вы знаете тип индекса, то есть статически во время компиляции.C++ Транспортировка данных условного типа времени выполнения

В базе данных есть функция, которая содержит оператор переключения времени выполнения для определения того, с каким индексом нужно разговаривать. Я хотел бы, чтобы эта функция возвращала информацию о времени выполнения из индекса (главным образом, итераторы), но также и тип статического порядка использования.

Чтобы показать намерение, вот какой-то псевдокод. Он не работает, так как ... может быть использована специальная спецификация шаблона для записи 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

Мне любопытно, как вы ожидаете, что 'getLookupInfo' будет работать. Я не понимаю, как это можно назвать. Операторы return не соответствуют типу return, что означает, что вам понадобится полиморфизм или специализация шаблонов. – AndyG

+0

Энди - да - вот где я не могу закрыть цикл. Фрагмент кода не будет работать, он больше предназначен, чтобы показать, что я хотел бы сделать. И вы правы, трюк каким-то образом должен сделать возвращаемый тип getLookupInfo возвращать мне другой тип каждый раз. Однако я не хочу виртуальных, поэтому я хотел бы использовать специализированную специализацию. Но даже это ИМХО сложно. Суть моего вопроса, вероятно: как я могу использовать специализированную специализацию для записи getLookupInfo? – Frank

+0

Трюк состоит в том, чтобы превратить все в тип ... Я могу помочь, если вы дадите мне какой-нибудь псевдокод, как вы его хотели бы назвать (без специализации шаблонов). – AndyG

ответ

0

Вы можете сделать это, свернув свой getLookupInfo -> примените последовательность 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); 
Смежные вопросы