-
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