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

Я пытаюсь скопировать таблицу базы данных на карту, где ее первичный ключ будет ключом карты, а остальные столбцы являются экземплярами 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

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

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

Спасибо !!

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> не требуется перед определениями функций-членов шаблона.

1

Другие решения

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

            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);
}
}
1

По вопросам рекламы [email protected]