Сейчас, работаю над собственным, небольшим, можно сказать учебным проектом, в котором активно начал использовать template методы. Например:
Внутри `OpenFile` - вызывается шаблонный метод `readData`:
template<typename retT,typename containerCastClass,typename castedClassType, typename obj_class, typename obj, typename ...args>
static retT readData( containerCastClass c,castedClassType c1,obj_class cl, obj o,args... ar);
Пример его вызова:
readData<QStringList>(static_cast<QStringList(QVariant::*)() const>(&QVariant::toStringList),
static_cast<void(QStringList::*)(const QList<QString> &t)>(&QStringList::append),
static_cast< QByteArray ( QIODevice:: * )(qint64 maxSize) >(&QFile::readLine),
currentOpenTxt,
qint64{0});
Собственно, основная работа метода, не учитывая дополнительных проверок:
auto read{
[&]()->auto{
static auto castedContainer = std::invoke(c, currentContainer);// convert QVariant to QStringList, QMap..
qDebug()<<typeid (castedContainer).raw_name();
QString readedData=std::invoke(cl,o,ar...); //read line from txt, row/column from xlsx
std::invoke(c1,castedContainer,retT({readedData}));//append, insert...
return castedContainer;
}
};
Но, написание подобного кода, далось мне довольно нелегко. Как развить навыки написания "универсального" параметризованного кода (Под универсальным, я понимаю конечно же не "серебряную пулю", а код, под определенный спектр задач, но достаточно гибкий и который можно с относительной легкостью встраивать в проекты со сходными требованиями.).