eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingwyzwanie z szablonami ;]
Ilość wypowiedzi w tym wątku: 10

  • 1. Data: 2011-10-06 15:51:07
    Temat: wyzwanie z szablonami ;]
    Od: "Sarr." <s...@g...pl>

    witam wszystkich,

    ostatnio stanalem przed pewnym problemem, ktory nie wiem jak elegancko
    rozwiazac, mianowicie mam cos takiego:

    template<class T> TSth
    {
    int _value;
    public:
    int GetValue() const { return _value }
    };

    teraz, mam takie klasy:
    class A : public Sth<A> {};
    class B : public A, public, Sth<B> {};
    po prostu, moze zaistniec klasa, ktora dziedziczy wiecej niz raz z tego
    template, ale z innym typem.

    w tym przypadku:
    A a;
    a.GetValue(); // bez problemu
    B b;
    b.GetValue() // ambigious access...

    chcialbym moc wykonac cos w stylu:
    b.GetValue<A>();
    b.GetValue<B>();
    moc odczytac wartosc z pewnego typu, z ktorego dziedziczy moje b. ale
    niekoniecznie dokladnie tak, po prostu cos, co wygladalo by lepiej niz:
    ((TSth<A>*)&b).GetValue();
    ((TSth<B>*)&b).GetValue();
    co jest brzydkie i niebezpieczne, bo casty sa static, trzeba by uzywac
    dynamic_cast do kazdego wywolania GetValue(), co z kolei nie wydaje sie
    eleganckie, bo trzeba by sprawdzac czy na pewno nie jest NULL, etc.
    mozna naturalnie owinac to we funkcje ale nie o to chodzi, to nie
    zmienia faktu, ze ten dynamic_cast tam bedzie sobie siedzial.

    probowalem dodac do Sth cos takiego:
    template<class U>
    int GetValue()
    {
    return Sth<U>::_value;
    }
    wtedy, dla jednakowych U i T kompilator nie powinien protestowac. ale
    czy to ma sens? czy ktos z grupowiczow moglby zaproponowac jakies inne
    rozwiazanie?

    pozdrawiam
    Marcin.


  • 2. Data: 2011-10-06 15:52:23
    Temat: Re: wyzwanie z szablonami ;]
    Od: Edek <e...@g...com>

    On 10/06/2011 05:51 PM, Sarr. wrote:
    > witam wszystkich,
    >
    > ostatnio stanalem przed pewnym problemem, ktory nie wiem jak elegancko
    > rozwiazac, mianowicie mam cos takiego:
    >
    > template<class T> TSth
    > {
    > int _value;
    > public:
    > int GetValue() const { return _value }
    > };
    >
    > teraz, mam takie klasy:
    > class A : public Sth<A> {};
    > class B : public A, public, Sth<B> {};
    > po prostu, moze zaistniec klasa, ktora dziedziczy wiecej niz raz z tego
    > template, ale z innym typem.
    >
    > w tym przypadku:
    > A a;
    > a.GetValue(); // bez problemu
    > B b;
    > b.GetValue() // ambigious access...
    >
    > chcialbym moc wykonac cos w stylu:
    > b.GetValue<A>();
    > b.GetValue<B>();
    > moc odczytac wartosc z pewnego typu, z ktorego dziedziczy moje b. ale
    > niekoniecznie dokladnie tak, po prostu cos, co wygladalo by lepiej niz:
    > ((TSth<A>*)&b).GetValue();
    > ((TSth<B>*)&b).GetValue();
    > co jest brzydkie i niebezpieczne, bo casty sa static, trzeba by uzywac
    > dynamic_cast do kazdego wywolania GetValue(), co z kolei nie wydaje sie
    > eleganckie, bo trzeba by sprawdzac czy na pewno nie jest NULL, etc.
    > mozna naturalnie owinac to we funkcje ale nie o to chodzi, to nie
    > zmienia faktu, ze ten dynamic_cast tam bedzie sobie siedzial.
    >
    > probowalem dodac do Sth cos takiego:
    > template<class U>
    > int GetValue()
    > {
    > return Sth<U>::_value;
    > }
    > wtedy, dla jednakowych U i T kompilator nie powinien protestowac. ale
    > czy to ma sens? czy ktos z grupowiczow moglby zaproponowac jakies inne
    > rozwiazanie?


    Nie kompilowałem, b->Sth<A>::GetValue()?

    Edek


  • 3. Data: 2011-10-06 16:24:08
    Temat: Re: wyzwanie z szablonami ;]
    Od: "Sarr." <s...@g...pl>

    On 6-10-2011 17:52, Edek wrote:
    > On 10/06/2011 05:51 PM, Sarr. wrote:
    >> witam wszystkich,
    >>
    >> ostatnio stanalem przed pewnym problemem, ktory nie wiem jak elegancko
    >> rozwiazac, mianowicie mam cos takiego:
    >>
    >> template<class T> TSth
    >> {
    >> int _value;
    >> public:
    >> int GetValue() const { return _value }
    >> };
    >>
    >> teraz, mam takie klasy:
    >> class A : public Sth<A> {};
    >> class B : public A, public, Sth<B> {};
    >> po prostu, moze zaistniec klasa, ktora dziedziczy wiecej niz raz z tego
    >> template, ale z innym typem.
    >>
    >> w tym przypadku:
    >> A a;
    >> a.GetValue(); // bez problemu
    >> B b;
    >> b.GetValue() // ambigious access...
    >>
    >> chcialbym moc wykonac cos w stylu:
    >> b.GetValue<A>();
    >> b.GetValue<B>();
    >> moc odczytac wartosc z pewnego typu, z ktorego dziedziczy moje b. ale
    >> niekoniecznie dokladnie tak, po prostu cos, co wygladalo by lepiej niz:
    >> ((TSth<A>*)&b).GetValue();
    >> ((TSth<B>*)&b).GetValue();
    >> co jest brzydkie i niebezpieczne, bo casty sa static, trzeba by uzywac
    >> dynamic_cast do kazdego wywolania GetValue(), co z kolei nie wydaje sie
    >> eleganckie, bo trzeba by sprawdzac czy na pewno nie jest NULL, etc.
    >> mozna naturalnie owinac to we funkcje ale nie o to chodzi, to nie
    >> zmienia faktu, ze ten dynamic_cast tam bedzie sobie siedzial.
    >>
    >> probowalem dodac do Sth cos takiego:
    >> template<class U>
    >> int GetValue()
    >> {
    >> return Sth<U>::_value;
    >> }
    >> wtedy, dla jednakowych U i T kompilator nie powinien protestowac. ale
    >> czy to ma sens? czy ktos z grupowiczow moglby zaproponowac jakies inne
    >> rozwiazanie?
    >
    >
    > Nie kompilowałem, b->Sth<A>::GetValue()?

    owszem przejdzie... oczywiscie, najciemniej pod latarnia...

    pytanie pozakonkursowe, oczywiscie b i Sth to uproszczenie dla potrzeb
    zadania, zazwyczaj beda to dluzsze nazwy, i w takim wypadku na przyklad:

    myHappyRotator->TComponentInterface<ConstRotatorComp
    onent>::GetValue();

    czy taki zapis mozna uznac za elegancki?

    pozdrawiam
    Marcin.


  • 4. Data: 2011-10-06 16:39:59
    Temat: Re: wyzwanie z szablonami ;]
    Od: " " <f...@g...pl>

    >
    > myHappyRotator->TComponentInterface<ConstRotatorComp
    onent>::GetValue();
    >
    > czy taki zapis mozna uznac za elegancki?
    >
    mozna uznac za dosyc elegancki, ale mozna tez tworzyc eleganckie zapisy
    w troche glupim jezyku i to drugie ew mogloby byc problemem (nie ze
    wypowiadam sie przeciwko c++, nie lubie jezykow 'oo' wogole)

    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 5. Data: 2011-10-06 22:10:52
    Temat: Re: wyzwanie z szablonami ;]
    Od: n...@m...invalid

    W dniu 6.10.2011 r. 17:51, Sarr. pisze:
    > witam wszystkich,
    >
    > ostatnio stanalem przed pewnym problemem, ktory nie wiem jak elegancko
    > rozwiazac, mianowicie mam cos takiego:
    >
    > template<class T> TSth
    [...]
    > pozdrawiam
    > Marcin.
    ->pl.comp.lang.c (C i C++ - kruczki, sztuczki, programowanie.) lub
    sprecyzuj język (C++?), PITA.


  • 6. Data: 2011-10-07 04:46:53
    Temat: Re: wyzwanie z szablonami ;]
    Od: Andrzej Jarzabek <a...@g...com>

    On 06/10/2011 17:24, Sarr. wrote:
    > On 6-10-2011 17:52, Edek wrote:
    >
    > pytanie pozakonkursowe, oczywiscie b i Sth to uproszczenie dla potrzeb
    > zadania, zazwyczaj beda to dluzsze nazwy, i w takim wypadku na przyklad:
    >
    > myHappyRotator->TComponentInterface<ConstRotatorComp
    onent>::GetValue();
    >
    > czy taki zapis mozna uznac za elegancki?

    Elegancko będzie owinąć to w klasie pochodnej w funkcję, której nazwa
    mówi co to jest to, co ona zwraca w kontekście tej klasy.


  • 7. Data: 2011-10-07 13:19:21
    Temat: Re: wyzwanie z szablonami ;]
    Od: "Sarr." <s...@g...pl>

    On 7-10-2011 6:46, Andrzej Jarzabek wrote:
    > On 06/10/2011 17:24, Sarr. wrote:
    >> On 6-10-2011 17:52, Edek wrote:
    >>
    >> pytanie pozakonkursowe, oczywiscie b i Sth to uproszczenie dla potrzeb
    >> zadania, zazwyczaj beda to dluzsze nazwy, i w takim wypadku na przyklad:
    >>
    >> myHappyRotator->TComponentInterface<ConstRotatorComp
    onent>::GetValue();
    >>
    >> czy taki zapis mozna uznac za elegancki?
    >
    > Elegancko będzie owinąć to w klasie pochodnej w funkcję, której nazwa
    > mówi co to jest to, co ona zwraca w kontekście tej klasy.

    racja. o to chodzilo.


  • 8. Data: 2011-10-07 13:37:38
    Temat: Re: wyzwanie z szablonami ;]
    Od: A.L. <l...@a...com>

    On Thu, 06 Oct 2011 17:52:23 +0200, Edek <e...@g...com>
    wrote:

    >On 10/06/2011 05:51 PM, Sarr. wrote:
    >> witam wszystkich,
    >>
    >> ostatnio stanalem przed pewnym problemem, ktory nie wiem jak elegancko
    >> rozwiazac, mianowicie mam cos takiego:
    >>

    Czy OP nie chodzi przypadkiem o "template specialization"?...

    A.L.


  • 9. Data: 2011-10-07 15:32:23
    Temat: Re: wyzwanie z szablonami ;]
    Od: Andrzej Jarzabek <a...@g...com>

    On Oct 7, 2:19 pm, "Sarr." <s...@g...pl> wrote:
    > On 7-10-2011 6:46, Andrzej Jarzabek wrote:
    >
    > > On 06/10/2011 17:24, Sarr. wrote:
    > >> On 6-10-2011 17:52, Edek wrote:
    >
    > >> pytanie pozakonkursowe, oczywiscie b i Sth to uproszczenie dla potrzeb
    > >> zadania, zazwyczaj beda to dluzsze nazwy, i w takim wypadku na przyklad:
    >
    > >> myHappyRotator->TComponentInterface<ConstRotatorComp
    onent>::GetValue();
    >
    > >> czy taki zapis mozna uznac za elegancki?
    >
    > > Elegancko będzie owinąć to w klasie pochodnej w funkcję, której nazwa
    > > mówi co to jest to, co ona zwraca w kontekście tej klasy.
    >
    > racja. o to chodzilo.

    Dodatkowo co jeszcze można zrobić dla poprawienia czytelności kodu to
    nadać klasom bazowym nazwy w klasie pochodnej przy pomocy typedef,
    np.:
    class HappyRotator: public TComponentInterface<ConstRotatorComponent>
    {
    typedef TComponentInterface<ConstRotatorComponent> ConstRotator;
    public:
    RotVal GetConstRotation() {
    return ConstRotator::GetValue();
    }

    (oczywiście nazwy funkcji i klasy wziąłem z sufitu, w rzeczywistości
    powinny odzwierciedlać semantykę danych konstrukcji)


  • 10. Data: 2011-10-07 16:16:50
    Temat: Re: wyzwanie z szablonami ;]
    Od: Edek <e...@g...com>

    On 10/07/2011 05:32 PM, Andrzej Jarzabek wrote:
    > On Oct 7, 2:19 pm, "Sarr."<s...@g...pl> wrote:
    >> On 7-10-2011 6:46, Andrzej Jarzabek wrote:
    >>
    >>> On 06/10/2011 17:24, Sarr. wrote:
    >>>> On 6-10-2011 17:52, Edek wrote:
    >>
    >>>> pytanie pozakonkursowe, oczywiscie b i Sth to uproszczenie dla potrzeb
    >>>> zadania, zazwyczaj beda to dluzsze nazwy, i w takim wypadku na przyklad:
    >>
    >>>> myHappyRotator->TComponentInterface<ConstRotatorComp
    onent>::GetValue();
    >>
    >>>> czy taki zapis mozna uznac za elegancki?
    >>
    >>> Elegancko będzie owinąć to w klasie pochodnej w funkcję, której nazwa
    >>> mówi co to jest to, co ona zwraca w kontekście tej klasy.
    >>
    >> racja. o to chodzilo.
    >
    > Dodatkowo co jeszcze można zrobić dla poprawienia czytelności kodu to
    > nadać klasom bazowym nazwy w klasie pochodnej przy pomocy typedef,
    > np.:
    > class HappyRotator: public TComponentInterface<ConstRotatorComponent>
    > {
    > typedef TComponentInterface<ConstRotatorComponent> ConstRotator;
    > public:
    > RotVal GetConstRotation() {
    > return ConstRotator::GetValue();
    > }
    >
    > (oczywiście nazwy funkcji i klasy wziąłem z sufitu, w rzeczywistości
    > powinny odzwierciedlać semantykę danych konstrukcji)

    Albo:

    template <class Comp>
    class ValueGetter
    {
    TComponentInterface<Comp> const * tci;
    public:
    ValueGetter(TComponentInterface<Comp> const * _tci) : tci(_tci) {};

    operator int () { return tci->GetValue(); };
    }

    Użycie:

    int val = ValueGetter<MyRod> (myHappyRotator);

    Sprawdziłbym też tuple->get<1>(). Kiedyś zajrzę i sprawdzę o co chodzi,
    jak to jest rozwiązane i dlaczego niektóre kompilatory nie pozwalają
    na rozwiązanie z member template i trzeba robić get<1>(tuple);

    Edek

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: