explicit specialization & scope

18 отговора 1051 прегледа
#1

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?

Отговор
в отговор на pliok #2

А какво всъщност си постигнал?!?

Аз пиша на C++, ма не чаткам какво целиш. Кви са тия празни функции, ква им е целта? Що трябва да постигаш специализацията им? Дай по простичко и по-обстойно.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #3

Re: А какво всъщност си постигнал?!?

е какво не му е ясното? :) естествено, че са празни функциите, това е само пример.... ок, с повече думи - имам си един голям (в смисъл много мембъри) шаблон и искам една конкретна функция вътре в него да е специализирана за боол както съм го написал в примера.

Отговор
в отговор на pliok #4

Re: explicit specialization &amp; 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>();}
};

Сигнатура!
Отговор
в отговор на Questor #5

Re: explicit specialization &amp; 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.

Отговор
в отговор на pliok #6

Re: explicit specialization &amp; scope

Разбрах за какво иде реч - тва е яко перверзия :)

Каквото ми идва на ум е да се override-ne f() с 1 параметър който може да е от 2 типа примерно True i False, и после там с някви магии bool-to-type да се викне съответния override....

(Ама не знам дали ша стане де - аз в александреску след като прочетхо едно изречение, че 'това видите ли било стандартно, ама нямало компилатор, дето да го опддържа', го чета само като съвсем нямам какво друго да правя )

Сигнатура!
Отговор
в отговор на Questor #7

Re: explicit specialization &amp; scope

гадното е, че го бях написал вече това нещо и чак след това разбрах, че не е стандартно... и сега изобщо не ми се разваля красотата дето се получи. иначе и аз не се кефя на румънеца и неговите глупости, споменах го защото докато се чудех дали е или не е стандартно се рових по разни места и попаднах на едни тяхни коментари.... александреску даже беше пуснал подобен код и твърдеше, че било стандартно................................................

Отговор
в отговор на pliak #8

Re: explicit specialization &amp; scope

ахъм. и тва дето го написах не е съвсем като хората, щото ще трябва и двата ф-а да могат да се компилират независимо от параметрите.

Сигнатура!
Отговор
в отговор на pliok #9

Re: explicit specialization &amp; 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();}
};



Това е само идея разбира се. За съжаление на моя компилатор не мога да направя експеримента. Успех!


Отговор
в отговор на Questor #10

Re: explicit specialization &amp; scope

Именно за това иде реч, ама аз не разбирам кое му е грозното на кода... :-)))

А румънеца, верно малко на ангро кара от време на време, ама поне е дал човека локи дето се билдва даже и с VC 6, макар и малко по ориязано.

Все пак един нормално развит човек се сеща за тези неща като прочете The C++ programming language, Advanced C++ templates, и Design patterns.

Отговор
в отговор на BjarneStroustrup® #11

Re: explicit specialization &amp; scope

нещо не разбрах какво точно искаше да кажеш? за какво се сеща всеки нормално развит човек? :) ако е за питането - аз не се сещам за сега, така че можеш да обясниш ти какво си се сетил ;)

Отговор
в отговор на plias #12

Re: explicit specialization &amp; scope

всеки нормално развит човек се сеща за нещата които обяснява румънеца, пише го в горното изречение.

Редактирано от BjarneStroustrup® на

Отговор
в отговор на pliok #13

???????

Бих искал да знам с какви компилатори го компилирате това?
Аз ползвам по-стар и знам и виждам че не става това, от първия постинг.
Но в Александреску изрично се казва, че:
"Although you can totally specialize member functions of a class template, you cannot partially specialize member functions".
И там се предлага идеята с function overload и неща като Int2Type.

Отговор
в отговор на ZZ #14

Re: ???????

Прав си, member функции не могат да се partial specialize-ират по стандарт. VC-то го поддържа въпреки това. Може да се workaround-не като се облекат в структура, но е грозно и тежко.

Отговор
в отговор на pliok #15

Re: explicit specialization &amp; scope

Да имах и аз такива проблеми...

Аз лично по-малко се интересувам дали е в стандарта и повече дали се поддържа от компилаторите които трябва. Стандарта еволюира, особено C++. А от това че много неща в стандарта не се поддържат от компилатора който ползвам мога само на арменския поп да се оплача...

Впрочем да имаш различна реализация на f() според булев параметър на темплейта е design smell... също както е smell булев параметър на функция да определя различно поведение.

Отговор
в отговор на Nero #16

Re: explicit specialization &amp; 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!

Отговор
в отговор на pliak #17

Съжалявам че вдигам стара тема

Първата част от това което ти писах беше по-съществената, но както и да е.

Приятел, смел не значи непременно нередност, а възможност за такава. Това което пишеш все повече ме убеждава че злоупотребяваш с езика, но няма да те убеждавам или да предлагам алтернатива за твоя случай, който не познавам.

Не е добре да използваш булеви параметри за да определяш различно поведение на интерфейс (в широкия смисъл на думата), защото това подвежда към неправилна употреба на този интерфейс. Справка - Writing Solid Code.

А темплейтите, "идейно", не са начин да си спестиш едно виртуално извикване на функция, а инструмент на езика за конструиране на абстракции.

Отговор
в отговор на Nero #18

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 :)

Отговор
в отговор на kliop #19

Re: Съжалявам че вдигам стара тема

Моя компилатор още не е догонил стандарта (както и доста други).

Стандартите не са нещо свято. Първо, създаването им е далеч от непорочното зачатие -- правят се от комитети, които често не са напълно наясно какво правят, и много от съображенията им са политически и социални, но не и технически. Второ, специално при С++, стандартите са нещо доста различно от това с което разполагаш като компилатори и библиотеки (има разширения, има и конструкции които не се поддържат). Трето, при С++ стандарта се променя, към по-добро, а компилаторите си поддържат обратна съвместимост със старите версии.

Практическата полза от придържането към кой да е стандарт, е че това което правиш ще работи с другите които се придържат към него. При С++, за да е една програма преносима за друга платформа, се изискват толкова усилия и тестване, че ако не ти се налага, няма смисъл да полагаш специални грижи в тази посока извън нормалните добри практики на програмиране. Ако ти се налага, най-добре да си пишеш по стандарта и да се оправяш с изключенията по бакалския начин с препроцесора -- както правят в Boost библиотеките например. Разбира се, с това не искам да кажа че е ОК да се приема фиксиран размер на типовете и т.н. Просто в твоя случай заменяш една елегантна конструкция с нещо, което не е нито елегантно нито разбираемо, в замяна на това да ти е маааалко по-лесно ако някога портваш към друга платформа която е достатъчно изостанала да не поддържа explicit specialization. При това работата по хипотетичното портване на този фрагмент си я свършил сега, вместо, най-вероятно, никога.

По втората точка, като казвам че не е хубаво да използваш "параметри за да определяш различно поведение", имам предвид кода ти да прави различни неща в зависимост от параметъра. Ако е int и е нормално да е >0, пък ако е ==0 е "специален случай" например.

Отговор