Сопоставление таблицы с картой с использованием вариативных шаблонов и повышения

Я пытаюсь скопировать таблицу базы данных на карту, где ее первичный ключ будет ключом карты, а остальные столбцы являются экземплярами boost:vector. Я новичок в повышении, а также вариативных шаблонах. Я пытался написать оболочку, но она отлично работает только для фиксированного количества столбцов. Ниже приведен код

#include <boost/container/vector.hpp>
#include <iostream>
#include <string>
#include <map>
#include <type_traits>

typedef boost::container::vector<std::string> MAPPED_COLS;
typedef std::map <int,  MAPPED_COLS >    TABLE ;
typedef std::map <int,  MAPPED_COLS > ::iterator ROW_ITER;

typedef std::string  str;

template <typename str>
class MappedTable
{
    private:
            TABLE           mapTable;
            MAPPED_COLS     cols;
            ROW_ITER        row;

            std::string     scTableName;
            int             iRows;
            int             iCols;
    public:
            MappedTable()  { iCols=3; }

            MappedTable(int iNumCols)  { iCols=iNumCols;}
            ~MappedTable() { }

            template <str>
            void    fnRowCols()     //termination version
            {
            }

            template <str>
            void    fnCols(const str& scCol2, const str& scCol3,...)
            {
                    if(cols.size()>=iCols)
                    {
                          cols.erase (cols.begin(),cols.begin()+iCols);
                    }
                    cols.push_back(scCol2);

                    fnCols(scCol3,...);
            }

            template <str>
            void fnMapRow(int iCol1,const str& scCol2,...)
            {
                    fnCols(scCol2,...);
                    mapTable[iCol1]=MAPPED_COLS(cols);
            }


            MAPPED_COLS& fnGetRow(int iFindKey)
            {
                    row=mapTable.find(iFindKey);
                    if(row!=mapTable.end())
                            return (row->second);
            }
 };

Ниже приведен main() для вышеуказанной оболочки, которая отлично работает, если я не использую вариативные шаблоны в своей оболочке: -

 int main()
 {
    MappedTable Table(3) ;

    std::string vid[]={"11", "21", "51", "41"};
    std::string fare[]={"100", "400", "200", "4000"};
    std::string vehicle[]={"bus", "car", "train", "aeroplane"};

    int i=0;

    for(i=0;i<4;i++)
    {
            Table.fnMapRow(i,vid[i],fare[i],vehicle[i]);
    }

    for(i=0;i<4;i++)
    {
            MAPPED_COLS mpCol=Table.fnGetRow(i);
            std::cout<<"\n  "<<i<<" "<<mpCol[0]<<" "<<mpCol[1]<<" "<<mpCol[2];
    }

    std::cout<<"\n";

    return 0;
}

Код был скомпилирован с помощью Boost 1.51.0 и gcc 4.4 с параметром std=c++0x.

Может ли кто-нибудь подсказать мне, что мне не хватает? Я открыт для лучших идей, а также хочу знать, как этот конкретный пример будет работать, даже если он недостаточно эффективен.

Фрагмент рабочего кода доступен в моем ответе ниже (спасибо Росту). Было бы здорово, если бы кто-нибудь мог предложить несколько лучших и дополнительных методов для хранения всей таблицы на карте.

Спасибо !!


person Leafy    schedule 19.10.2012    source источник


Ответы (2)


Синтаксис функции шаблона с переменным числом аргументов выглядит некорректно. Это должно быть так:

 template <typename... VarArgs>
 void fnCols(const str& scCol2, const str& scCol3, const VarArgs&... args)
 {
     // Non-relevant code skipped
     fnCols(scCol3, args...); // Recursive call with expanding arguments pack
 } 

Аналогичная проблема с fnMapRow. Также template <str> не требуется перед определениями функций-членов шаблона.

person Rost    schedule 19.10.2012
comment
Большое спасибо, Рост, ответ Ура мне очень помог. Но, пожалуйста, исправьте синтаксис на template <typename... VarArgs> . Также я пока не принимаю ваш ответ, потому что я все еще оставляю вопрос открытым для лучших подходов и предложений. Жду вашего предложения.. - person Leafy; 22.10.2012

Я нашел ответ на проблему. Ниже приведен рабочий код, если он кому-то понадобится в будущем.

            void    fnCols()        //termination version
            {
            }


            template <typename... VarArgs>
            void    fnCols(const str& scCol2, const VarArgs&...args)
            {
                    if(cols.size()>=iCols)
                    {
                            cols.erase (cols.begin(),cols.begin()+iCols);
                    }
                    cols.push_back(scCol2);
                    fnCols(args...);
            }

            template <typename... VarArgs>
            void fnMapRow(int iCol1, const VarArgs&... args)
            {
                    static const int iNumArgs = sizeof...(VarArgs);
                    if(iNumArgs==iCols)
                    {
                            fnCols(args...);
                            mapTable[iCol1]=MAPPED_COLS(cols);
                    }                       
            }
person Leafy    schedule 22.10.2012