[ MikeLDN @ 23.09.2006. 12:46 ] @
Da li je moguce napraviti funkcionalnost:

template <typename T>
class CMyDialog: public CDialog
{
......
};
[ NrmMyth @ 23.09.2006. 16:37 ] @
Ne vidim zasto nebi moglo.
[ djalfirevic @ 23.09.2006. 18:07 ] @
Apsolutno.
[ MikeLDN @ 24.09.2006. 00:01 ] @
problem sa makroima BEGIN_MESSAGE_MAP

kako ih formulisati i gde staviti?
[ kiklop74 @ 24.09.2006. 00:44 ] @
Nece to tako moci. Microsoft je tako dizajnirao te MFC klase da je templatizacija prakticno neizvodiva ako se koriste message mape i sl.

Sta fali klasicnom nasledjivanju?

[ MikeLDN @ 24.09.2006. 09:17 ] @
imam ceo niz templatizovanih algoritama i treba da prosledim tip u dijalog, ili mozda neki factory?
[ kiklop74 @ 24.09.2006. 15:15 ] @
Ajde malo to bolje objasni sa nekim pseudo kodom. Sta tacno zelis da uradis?
[ MikeLDN @ 24.09.2006. 15:38 ] @
OK.

Dakle neka je dialog npr dijalog za proracun i prikaz rezultata nekakvih objekata.
Objekti su slicni i koriste zajednicke template f-je koje se staraju da urade obradu kako treba (gde je bilo potrebno uradjena je specijalizacija). Rezultat je da npr:

template <typename T>
void ProracunajNesto(T element) {...}

radi kako treba za ProracunajNesto<klasa1> i za ProracunajNesto<klasa2> ..itd.

Najintuitivnije bi bilo da u trenutku kad se kreira dijalog i kad znam za koj tip objekta je pozvan pozovem:

CMyDialog<klasa1> dlg; dlg.DoModal(); ali ovo ne moze zbog MFC makroa vezanih za CDialog.

Sledece sam probao sa Loki typelist-ama TYPELIST_n<klasa1,klasa2...>
i to radi ok ako ti treba instanca preko konstantnog indexa

ProracunajNesto<TYPELIST.TypeAt(1)>
(sintaksa za indexirani pristup je malo drugacija ali to je ideja...)
medjutim nece raditi sa promenljivim tipa

CMyDialog.n_indexTipaZaKojiJePozvanOvajDijalog

Izguglao sam neke varijante sa pravljenjem svog BEGIN_MESSAGE_MAP makroa
( http://www.codeguru.com/cpp/cp...c/templates/article.php/c4099/ ) ali to mi nesto ne mirise...

Any idea?
[ kiklop74 @ 24.09.2006. 19:17 ] @
Najbolje onda da imas neku vrstu template proxy klase iz koje ces puniti i pozivati dijalog. Nesto kao ovo:
Code:
#pragma once

///Najbolje je definisati te objekte da imaju neki abstraktni interfejs
class baseType {
public:
    baseType() {}
    virtual void TransferTo(CEdit &ctrl) {}
    virtual void TransferTo(CListBox &ctrl) {}
    ///Dodati druge po zelji
    virtual CString ToString(void) {return CString();}
};

class tip1 : public baseType {
public:
    tip1() {}
    virtual void TransferTo(CEdit &ctrl) {ctrl.SetWindowText(m_string);}
    virtual void TransferTo(CListBox &ctrl) {ctrl.AddString(m_string);}
    virtual void TransferTo(CListCtrl &ctrl) {///itd.}
    virtual CString ToString(void) {return m_string;}
    ///Dodaj ovde ostale metode specificne za klasu
private:
    CString m_string;
};

template <class T, class dialogType>
class proxyCaller {
public:
    proxyCaller()  {} 
    ~proxyCaller() {}
    int DoShowModal(void) {
        ///Ovde treba implementirati punjenje dijaloga
        ///Dakle sve kontrole treba da budu u DoDataExchange
        ///Sve klase (tip T) koje ces da koristis
        ///je pozeljno da imaju iste metode za transfer podataka
        ///u zeljenu kontrolu
        Proracunajnesto(obj1);
        ProracunajNesto(obj2);

        dialogType dlg;
        //vrednosti mozes da postavljas ovako
        dlg.m_editbox1.SetWindowText(obj1.ToString());
        dlg.m_editbox2.SetWindowText(obj2.ToString());
        ///ili ovako
        obj1.TransferTo(dlg.m_editbox1);
        obj2.TransferTo(dlg.m_editbox2);
        return dlg.DoModal();
    }
private:
    T obj1;
    T obj2;
};

class MyDialog : public CDialog {
public:
    MyDialog(CWnd* pParent = NULL): 
      CDialog(IDD_MYDIALOG, pParent) { }
      enum {IDD_MYDIALOG}
      CEdit m_editbox1;
      CEdit m_editbox2;
protected:
    virtual void DoDataExchange(CDataExchange* pDX){
        CDialog::DoDataExchange(pDX);
        DDX_Control(pDX, IDC_EDIT1, m_editbox1);
        DDX_Control(pDX, IDC_EDIT1, m_editbox2);
    }
    DECLARE_MESSAGE_MAP()
};
[ MikeLDN @ 24.09.2006. 20:52 ] @
thnx,
mislim da ce moci tako, jedino sto cu sav dzumbus sa kontrolama spakovati u neki objekat pa cu njega da vozim kroz kod
[ Dragi Tata @ 24.09.2006. 22:19 ] @
Pogledaj ovo:

http://www.lenholgate.com/archives/000554.html
[ nikoladsp @ 29.09.2006. 08:21 ] @
dali bi ti odgovarao WTL?on se ponasa po svojoj prirodi kao sablon?moze i ATL, ali je WTL zgodan wrapper oko ATL i ima sve moje simpatije:brz je, jednostavan,kod je solidno brz,a nije zamuljan i bagovit kao MFC