explicit specialization & scope
18 отговора
1051 прегледа
explicit specialization & scope
ne znam dali sa ostanali hora pisheshti na c++ wyw foruma, no wse pak:
template <class T, bool B> struct A
{
template <bool> void f();
template <> void f<true>() {}
template <> void f<false>() {}
void F() {f<B>();}
};
estestweno wypreki nqkoi komentari na Myers i Alexandrescu towa ne e standartno i tuk idwa wyprosyt: kak da postigna syshtoto bez da zagrozqwam koda?
template <class T, bool B> struct A
{
template <bool> void f();
template <> void f<true>() {}
template <> void f<false>() {}
void F() {f<B>();}
};
estestweno wypreki nqkoi komentari na Myers i Alexandrescu towa ne e standartno i tuk idwa wyprosyt: kak da postigna syshtoto bez da zagrozqwam koda?
А какво всъщност си постигнал?!?
Аз пиша на C++, ма не чаткам какво целиш. Кви са тия празни функции, ква им е целта? Що трябва да постигаш специализацията им? Дай по простичко и по-обстойно.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: А какво всъщност си постигнал?!?
е какво не му е ясното? :) естествено, че са празни функциите, това е само пример.... ок, с повече думи - имам си един голям (в смисъл много мембъри) шаблон и искам една конкретна функция вътре в него да е специализирана за боол както съм го написал в примера.
Re: explicit specialization & scope
кое не му е стандартното?
гледам, че и това става : (ВЦ7)
template <class T, bool B> struct A
{
static const bool b = B;
template <bool> void f();
template <> void f<true>() {}
template <> void f<false>() {}
void F() {f<b>();}
};
Сигнатура!
гледам, че и това става : (ВЦ7)
template <class T, bool B> struct A
{
static const bool b = B;
template <bool> void f();
template <> void f<true>() {}
template <> void f<false>() {}
void F() {f<b>();}
};
Сигнатура!
Re: explicit specialization & scope
da s nowite cl stawa, ama ne e standartno. gramatikata koqto wyrwi s ISO-to ne go dopuska. probwaj s comeau ([линк]), gcc syshto ne go puska.
Re: explicit specialization & scope
Разбрах за какво иде реч - тва е яко перверзия :)
Каквото ми идва на ум е да се override-ne f() с 1 параметър който може да е от 2 типа примерно True i False, и после там с някви магии bool-to-type да се викне съответния override....
(Ама не знам дали ша стане де - аз в александреску след като прочетхо едно изречение, че 'това видите ли било стандартно, ама нямало компилатор, дето да го опддържа', го чета само като съвсем нямам какво друго да правя
)
Сигнатура!
Каквото ми идва на ум е да се override-ne f() с 1 параметър който може да е от 2 типа примерно True i False, и после там с някви магии bool-to-type да се викне съответния override....
(Ама не знам дали ша стане де - аз в александреску след като прочетхо едно изречение, че 'това видите ли било стандартно, ама нямало компилатор, дето да го опддържа', го чета само като съвсем нямам какво друго да правя
Сигнатура!
Re: explicit specialization & scope
гадното е, че го бях написал вече това нещо и чак след това разбрах, че не е стандартно... и сега изобщо не ми се разваля красотата
дето се получи. иначе и аз не се кефя на румънеца и неговите глупости, споменах го защото докато се чудех дали е или не е стандартно се рових по разни места и попаднах на едни тяхни коментари.... александреску даже беше пуснал подобен код и твърдеше, че било стандартно................................................
Re: explicit specialization & scope
ахъм. и тва дето го написах не е съвсем като хората, щото ще трябва и двата ф-а да могат да се компилират независимо от параметрите.
Сигнатура!
Сигнатура!
Re: explicit specialization & scope
template <bool B> struct is_true {enum value ; } ;
template <> struct is_true<true> {enum {value = 1 } ; } ;
template <> struct is_true<false> {enum {value = 0 }; } ;
template <bool B> struct is_false {enum value ; } ;
template <> struct is_false<true> {enum {value = 0 } ; } ;
template <> struct is_false<false> {enum {value = 1 } ; } ;
template <class T, bool B> struct A
{
template <bool B, void>
typename enable_if<is_true<B>, T>::type f() { }
template <false, void>
typename enable_if<is_false<B>, T>::type f() { }
void F() {f();}
};
Това е само идея разбира се. За съжаление на моя компилатор не мога да направя експеримента. Успех!
Re: explicit specialization & scope
Именно за това иде реч, ама аз не разбирам кое му е грозното на кода... :-)))
А румънеца, верно малко на ангро кара от време на време, ама поне е дал човека локи дето се билдва даже и с VC 6, макар и малко по ориязано.
Все пак един нормално развит човек се сеща за тези неща като прочете The C++ programming language, Advanced C++ templates, и Design patterns.
А румънеца, верно малко на ангро кара от време на време, ама поне е дал човека локи дето се билдва даже и с VC 6, макар и малко по ориязано.
Все пак един нормално развит човек се сеща за тези неща като прочете The C++ programming language, Advanced C++ templates, и Design patterns.
Re: explicit specialization & scope
нещо не разбрах какво точно искаше да кажеш? за какво се сеща всеки нормално развит човек? :) ако е за питането - аз не се сещам за сега, така че можеш да обясниш ти какво си се сетил ;)
Re: explicit specialization & scope
всеки нормално развит човек се сеща за нещата които обяснява румънеца, пише го в горното изречение.
Редактирано от BjarneStroustrup® на
???????
Бих искал да знам с какви компилатори го компилирате това?
Аз ползвам по-стар и знам и виждам че не става това, от първия постинг.
Но в Александреску изрично се казва, че:
"Although you can totally specialize member functions of a class template, you cannot partially specialize member functions".
И там се предлага идеята с function overload и неща като Int2Type.
Аз ползвам по-стар и знам и виждам че не става това, от първия постинг.
Но в Александреску изрично се казва, че:
"Although you can totally specialize member functions of a class template, you cannot partially specialize member functions".
И там се предлага идеята с function overload и неща като Int2Type.
Re: ???????
Прав си, member функции не могат да се partial specialize-ират по стандарт. VC-то го поддържа въпреки това. Може да се workaround-не като се облекат в структура, но е грозно и тежко.
Re: explicit specialization & scope
Да имах и аз такива проблеми...
Аз лично по-малко се интересувам дали е в стандарта и повече дали се поддържа от компилаторите които трябва. Стандарта еволюира, особено C++. А от това че много неща в стандарта не се поддържат от компилатора който ползвам мога само на арменския поп да се оплача...
Впрочем да имаш различна реализация на f() според булев параметър на темплейта е design smell... също както е smell булев параметър на функция да определя различно поведение.
Аз лично по-малко се интересувам дали е в стандарта и повече дали се поддържа от компилаторите които трябва. Стандарта еволюира, особено C++. А от това че много неща в стандарта не се поддържат от компилатора който ползвам мога само на арменския поп да се оплача...
Впрочем да имаш различна реализация на f() според булев параметър на темплейта е design smell... също както е smell булев параметър на функция да определя различно поведение.
Re: explicit specialization & scope
mhmh? shto pyk da e design smell? hajde da obqsnish po-podrobno, please! :) ama molq da obqsnish i template-ite za kakwo slujat (idejno), che neshto maj ne sym gi razbral qwno kakto trqbwa :)
w konkretniqt sluchaj mi e mnogo polezno, tyj kato wsqka druga realizaciq e minimum 5% po bawna, chestno! :)))))))))) wqrno, che optimizaciite po princip si smell-wat ama nqma nachin - wyprosnata funkciq se wika (i nqma kak da ne se wika) mnogo, mnogo, mnogo, izkliuchitelno mnogo pyti ;)
btw, zakyrpih problema s Int2Type bozata - 10x na tiq koito sa me powliqli po nqkakyw nachin!
w konkretniqt sluchaj mi e mnogo polezno, tyj kato wsqka druga realizaciq e minimum 5% po bawna, chestno! :)))))))))) wqrno, che optimizaciite po princip si smell-wat ama nqma nachin - wyprosnata funkciq se wika (i nqma kak da ne se wika) mnogo, mnogo, mnogo, izkliuchitelno mnogo pyti ;)
btw, zakyrpih problema s Int2Type bozata - 10x na tiq koito sa me powliqli po nqkakyw nachin!
Съжалявам че вдигам стара тема
Първата част от това което ти писах беше по-съществената, но както и да е.
Приятел, смел не значи непременно нередност, а възможност за такава. Това което пишеш все повече ме убеждава че злоупотребяваш с езика, но няма да те убеждавам или да предлагам алтернатива за твоя случай, който не познавам.
Не е добре да използваш булеви параметри за да определяш различно поведение на интерфейс (в широкия смисъл на думата), защото това подвежда към неправилна употреба на този интерфейс. Справка - Writing Solid Code.
А темплейтите, "идейно", не са начин да си спестиш едно виртуално извикване на функция, а инструмент на езика за конструиране на абстракции.
Приятел, смел не значи непременно нередност, а възможност за такава. Това което пишеш все повече ме убеждава че злоупотребяваш с езика, но няма да те убеждавам или да предлагам алтернатива за твоя случай, който не познавам.
Не е добре да използваш булеви параметри за да определяш различно поведение на интерфейс (в широкия смисъл на думата), защото това подвежда към неправилна употреба на този интерфейс. Справка - Writing Solid Code.
А темплейтите, "идейно", не са начин да си спестиш едно виртуално извикване на функция, а инструмент на езика за конструиране на абстракции.
Re: Съжалявам че вдигам стара тема
oops, sorry ne sym razbral, che pyrwata chast e syshtestwenata.... prosto ne powqrwah, che si q napisal seriozno! kakwo znachi da ne se interesuwash ot standarta? sys wsichki standarti li postypwash taka!? wqrno e - 'ewoliuirat', c++ standarta maj ima 2-3 ewoliucii za 15 godini, ot druga strana kolko 'ewoliucii' ima twoq kompilator?
inache, po wtorata chast s mnogo ot neshtata sym syglasen. samo iskam da utochnq, che ima razlika mejdu template parameter i parametyr.... abe sega kato se zamislq dori da dopusnem che nqma semantichna razlika, pak twyrdenieto "Не е добре да използваш булеви параметри за да определяш различно поведение на интерфейс" zwuchi twyrde symnitelno. po taq logika wseki parametyr na interface moje byde podwedejdasht - predstawqsh li si edin int32 po kolko nachina moje da te podwede!? a int64!?
ne se wprqgaj, samo iskam da ti podskaja, che standartite za razlika ot dogmite trqbwa da se spazwat :)
inache, po wtorata chast s mnogo ot neshtata sym syglasen. samo iskam da utochnq, che ima razlika mejdu template parameter i parametyr.... abe sega kato se zamislq dori da dopusnem che nqma semantichna razlika, pak twyrdenieto "Не е добре да използваш булеви параметри за да определяш различно поведение на интерфейс" zwuchi twyrde symnitelno. po taq logika wseki parametyr na interface moje byde podwedejdasht - predstawqsh li si edin int32 po kolko nachina moje da te podwede!? a int64!?
ne se wprqgaj, samo iskam da ti podskaja, che standartite za razlika ot dogmite trqbwa da se spazwat :)
Re: Съжалявам че вдигам стара тема
Моя компилатор още не е догонил стандарта (както и доста други).
Стандартите не са нещо свято. Първо, създаването им е далеч от непорочното зачатие -- правят се от комитети, които често не са напълно наясно какво правят, и много от съображенията им са политически и социални, но не и технически. Второ, специално при С++, стандартите са нещо доста различно от това с което разполагаш като компилатори и библиотеки (има разширения, има и конструкции които не се поддържат). Трето, при С++ стандарта се променя, към по-добро, а компилаторите си поддържат обратна съвместимост със старите версии.
Практическата полза от придържането към кой да е стандарт, е че това което правиш ще работи с другите които се придържат към него. При С++, за да е една програма преносима за друга платформа, се изискват толкова усилия и тестване, че ако не ти се налага, няма смисъл да полагаш специални грижи в тази посока извън нормалните добри практики на програмиране. Ако ти се налага, най-добре да си пишеш по стандарта и да се оправяш с изключенията по бакалския начин с препроцесора -- както правят в Boost библиотеките например. Разбира се, с това не искам да кажа че е ОК да се приема фиксиран размер на типовете и т.н. Просто в твоя случай заменяш една елегантна конструкция с нещо, което не е нито елегантно нито разбираемо, в замяна на това да ти е маааалко по-лесно ако някога портваш към друга платформа която е достатъчно изостанала да не поддържа explicit specialization. При това работата по хипотетичното портване на този фрагмент си я свършил сега, вместо, най-вероятно, никога.
По втората точка, като казвам че не е хубаво да използваш "параметри за да определяш различно поведение", имам предвид кода ти да прави различни неща в зависимост от параметъра. Ако е int и е нормално да е >0, пък ако е ==0 е "специален случай" например.
Стандартите не са нещо свято. Първо, създаването им е далеч от непорочното зачатие -- правят се от комитети, които често не са напълно наясно какво правят, и много от съображенията им са политически и социални, но не и технически. Второ, специално при С++, стандартите са нещо доста различно от това с което разполагаш като компилатори и библиотеки (има разширения, има и конструкции които не се поддържат). Трето, при С++ стандарта се променя, към по-добро, а компилаторите си поддържат обратна съвместимост със старите версии.
Практическата полза от придържането към кой да е стандарт, е че това което правиш ще работи с другите които се придържат към него. При С++, за да е една програма преносима за друга платформа, се изискват толкова усилия и тестване, че ако не ти се налага, няма смисъл да полагаш специални грижи в тази посока извън нормалните добри практики на програмиране. Ако ти се налага, най-добре да си пишеш по стандарта и да се оправяш с изключенията по бакалския начин с препроцесора -- както правят в Boost библиотеките например. Разбира се, с това не искам да кажа че е ОК да се приема фиксиран размер на типовете и т.н. Просто в твоя случай заменяш една елегантна конструкция с нещо, което не е нито елегантно нито разбираемо, в замяна на това да ти е маааалко по-лесно ако някога портваш към друга платформа която е достатъчно изостанала да не поддържа explicit specialization. При това работата по хипотетичното портване на този фрагмент си я свършил сега, вместо, най-вероятно, никога.
По втората точка, като казвам че не е хубаво да използваш "параметри за да определяш различно поведение", имам предвид кода ти да прави различни неща в зависимост от параметъра. Ако е int и е нормално да е >0, пък ако е ==0 е "специален случай" например.