Отображение таблицы в карте, используя шаблоны с переменным числом аргументов и повысить
Я пытаюсь скопировать таблицу базы данных в карту, где ее первичный ключ будет ключом карты, а остальные столбцы-экземплярами 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
может ли кто-нибудь подсказать мне, чего мне не хватает?
Я открыт для лучших идей, а также стремлюсь узнать, как этот конкретный пример будет работать, даже если он недостаточно эффективен.
Рабочий фрагмент кода доступен в моем ответе ниже (благодаря Rost). Было бы здорово, если бы кто-нибудь мог предложить несколько лучших и более эффективных методов для хранения всей таблицы на карте.
Спасибо !!
2 ответа:
Синтаксис функции variadic template не выглядит корректным. Это будет так:
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>
не требуется перед определениями функций-членов шаблона.
Я нашел ответ на эту проблему. Ниже приведен рабочий код, если он кому-то понадобится в будущем.
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); } }