3.23.2011

Про обход ограничений.

Испугавшись последствий после предыдущего поста, мои руки както сами собой, без особого участия головы перевели код из дефайнов в темплейт, заодно соорудив еще один темплейт. Всего то навсего надо было лишнее наследование прикрутить.

Теперь это выглядит так:
[cc lang="C++"]
#ifndef TTAGCONTAINER_H
#define TTAGCONTAINER_H
// --------------------------------------------------- h -----------------------------------------
#include "wtagcontainer.h"

namespace ui
{
namespace tag
{

template class TTagContainer: public base::WTagContainer, public TBase
{
public:
TTagContainer(QWidget *parent = 0);
~TTagContainer();
void setObjectName(const QString &name);
private:
QString selectSQL(bool attachedOnly);
hacc::TDBId itemID();
void tagClickedEvent(const hacc::TDBId &tagID);
hacc::model::TItemTags & itemTags();
TBases *m_worker;
};

}
}

// --------------------------------------------------- cpp -----------------------------------------
namespace ui
{
namespace tag
{

template TTagContainer::TTagContainer(QWidget *parent) : base::WTagContainer(parent), TBase()
{
m_worker = static_cast(TBase::worker());
}
template TTagContainer::~TTagContainer() {}
template hacc::TDBId TTagContainer::itemID() { return TBase::id(); }
template void TTagContainer:: setObjectName(const QString &name) { base::WTagContainer::setObjectName(name); }
template QString TTagContainer::selectSQL(bool attachedOnly)
{
return attachedOnly ?
m_worker->selectSelfTagsQuery() :
m_worker->selectAllTagsQuery();
}

template void TTagContainer::tagClickedEvent(const hacc::TDBId &tagID)
{
setAttached(tagID, m_worker->retachTag(tagID, TBase::id()));
}

template hacc::model::TItemTags & TTagContainer::itemTags()
{
return m_worker->tags(TBase::id());
}

}
}
#endif // TTAGCONTAINER_H
[/cc]

Да и дело то было не в бобине, а в том что г++ не умеет шаблоны из заголовка+реализации. Надо все в заголовке писать.
Использование выглядит совсем красиво: :)
[cc lang="C++"]
ui::form::FItemTagsEdit< ui::tag::TTagContainer < CThing, CThings > > *dialog =
new ui::form::FItemTagsEdit< ui::tag::TTagContainer < CThing, CThings > >(id);
if(dialog->exec() == QDialog::Accepted)
{
}
delete dialog;
[/cc]
Так что вот. Есть еще извилины в голове...


Оригинал записи - в личном блоге. Комментировать можно тут, но желательно там.

Комментариев нет: